AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

总结: aop是把核心业务代码和非核心业务代码进行分离,从而降低代码耦合。

耦合度: 耦合度就是对象之间的依赖性,对象之间的多重依赖,降低对象之间的耦合度从而提高代码的可重复利用性,更方便维护。

举例说明:

1.首先要在pom.xml中导入jar包

 <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
</dependencies>

2.配置映射文件

先扫包,然后开启aop
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 扫包 -->
<context:component-scan base-package="com.qy143.aop"/>
<!-- 开启aop-->
<aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>

3.接口

public interface IA {
int add(int num1,int num2);
int sum(int num1,int num2);
double div(int num1,int num2);
}

4.接口实现类

//核心代码
@Component(value = "A")
public class A implements IA{
@Override
public int add(int num1, int num2) {
int result =num1 + num2;
return result;
} @Override
public int sum(int num1, int num2) {
int result =num1 - num2;
return result;
} @Override
public double div(int num1, int num2) {
int result =num1 / num2;
return result;
}
}

5.日志切面

@Component  //和 @controller 一样
@Aspect //定义切面
//JoinPoint 切入点
public class LogAspect { //日志切面类
/**
* 第一个* 表示该方法得修饰符和返回类型
* 第二个* 表示指定包下所有的类。
* 第三个* 表示该类下所有的方法
* .. 方法得任意参数
*/
@Pointcut(value = "execution(* com.qy143.aop.*.*(.. ))")
public void pointcut(){ }

// @Before(value = "execution(public int com.qy143.aop.A.add(int,int ))")
@Before(value = "pointcut()") //该方法在指定表达式之前执行
public void show(JoinPoint joinPoint){
System.out.println("日志开始");
System.out.println("this "+joinPoint.getSignature().getName()+" begin with "+ Arrays.asList(joinPoint.getArgs()));
} @After(value = "pointcut()") //在都执行完后的最后执行,等价于finally;
public void after(){
System.out.println("----------------------");
System.out.println("After: 日志结束"); } @AfterReturning(value = "pointcut() ",returning = "r") //接有参数
public void afterReturning(JoinPoint joinPoint,Object r){
System.out.println("----------------------");
System.out.println("AfterReturning: This method "+joinPoint.getSignature().getName()+" ends "+r);
} @AfterThrowing(value = "pointcut()",throwing = "e")
public void afterThrowing( Throwable e){
System.out.println("Exception: "+e); }
}

6.测试类

 1 public class Test {
2 public static void main(String[] args) {
3 //配置应用上下文 把映射文件加进来
4 ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");
5 //根据Bean名称获取Bean,如果在spring ioc(控制反转)容器中存在bean,返回类型为Object类型
6 //在获取bean之后,要将转换为所需要的类型,不然可能产生异常
7 A a =(A) app.getBean("A");
8 int add = a.add(5,3);
9 System.out.println("结果:"+add);
10 double div = a.div(2,0);
11 System.out.println("结果:"+div);
12 }
13 }

@Before: 前置通知, 在方法执行之前执行

@After: 后置通知, 在方法执行之后执行

@AfterRunning: 返回通知, 在方法返回结果之后执行

@AfterThrowing: 异常通知, 在方法抛出异常之后

最新文章

  1. 从2G到5G, 基站天线过去与未来
  2. jdk 设计模式
  3. 【OPENGL】第三篇 着色器基础(一)
  4. 函数指针_typedef
  5. 【62测试】【状压dp】【dfs序】【线段树】
  6. js运动 运动效果留言本
  7. Xen学习——原理要点归纳总结
  8. Hibernate之QBC检索和本地SQL检索
  9. STDMETHOD_,STDMETHOD,__declspec(novtable)和__declspec(selectany)
  10. BIP Requests Are Failing With Error &amp;quot;OPP Error Oracle.apps.xdo.XDOException: Error Creating Lock Fil
  11. 【IE6的疯狂之四】IE6文字溢出BUG
  12. ActiveMQ + NodeJS + Stomp 极简入门
  13. 【深度学习篇】--Windows 64下tensorflow-gpu安装到应用
  14. 解决jenkins shell执行sonar-scanner提示命令存在的问题
  15. Linux更新源汇总-18.9.7更新
  16. mongodb实现自增的方法
  17. LeetCode算法题(长期更新)
  18. angular4 组件通讯、生命周期
  19. saltstack系列~第一篇
  20. log4j日志输出使用_1

热门文章

  1. 第十五章---JSON
  2. [atAGC054E]ZigZag Break
  3. [hdu7081]Pty loves book
  4. 【Tool】IntelliJ IDEA Ultimate2019.1 中文版 安装
  5. 【SpringBoot】(1)-- 基于eclipse配置springboot开发环境
  6. Java设计模式之(十二)——观察者模式
  7. 面渣逆袭:HashMap追魂二十三问
  8. 洛谷 P4621 - [COCI2012-2013#6] BAKTERIJE(exCRT)
  9. Oracle-oracle中union和union all的区别
  10. 学习java 7.22