Spring AOP简单了解(雷丰阳老师的笔记) (转)
AOP:(Aspect Oriented Programming)面向切面编程;
OOP:(Object Oriented Programming )面向对象编程;
面向切面编程:基于OOP基础之上新的编程思想;
指在程序运行期间,将某段代码动态的切入到指定方法的指定位置进行运行的这种编程方式,面向切面编程;
场景:计算器运行计算方法的时候进行日志记录;
加日志记录:
1)、直接编写在方法内部;不推荐,修改维护麻烦;
-
日志记录:系统的辅助功能;
-
-
业务逻辑:(核心功能)
-
-
耦合;
2)、我们希望的是;
-
业务逻辑:(核心功能);日志模块;在核心功能运行期间,自己动态的加上;
-
-
运行的时候,日志功能可以加上;
可以使用动态代理来将日志代码动态的在目标方法执行前后先进行执行;
动态代理:
-
1)、写起来难;
-
-
2)、jdk默认的动态代理,如果目标对象没有实现任何接口,是无法为他创建代理对象的;
Spring动态代理难;Spring实现了AOP功能;底层就是动态代理;
-
1)、可以利用Spring一句代码都不写的去创建动态代理;
-
-
实现简单,而且没有强制要求目标对象必须实现接口;
将某段代码(日志)动态的切入(不把日志代码写死在业务逻辑方法中)到指定方法(加减乘除)的指定位置(方法的开始、结束、异常。。。)进行运行的这种编程方式(Spring简化了面向切面编程)
AOP使用步骤:
1)、导包;
commons-logging-1.1.3.jar
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
Spring支持面向切面编程的包是:
spring-aspects-4.0.0.RELEASE.jar:基础版
加强版的面向切面编程(即使目标对象没有实现任何接口也能创建动态代理)
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
2)、写配置;
-
1)、将目标类和切面类(封装了通知方法(在目标方法执行前后执行的方法))加入到ioc容器中
-
-
2)、还应该告诉Spring到底哪个是切面类
-
-
3)、告诉Spring,切面类里面的每一个方法,都是何时何地运行;
@Before(“execution(public int com.atguigu.impl.MyMathCalculator.*(int, int))”)
//注意嗷,只有参数类型,没有参数值
-
public static void logStart(){
-
-
System.out.println("【xxx】方法开始执行,用的参数列表【xxx】");
-
-
}
-
-
-
-
-
//想在目标方法正常执行完成之后执行
-
-
@AfterReturning("execution(public int com.atguigu.impl.MyMathCalculator.*(int, int))")
-
-
public static void logReturn(){
-
-
System.out.println("【xxxx】方法正常执行完成,计算结果是:");
-
-
}
-
-
-
-
-
//想在目标方法出现异常的时候执行
-
-
@AfterThrowing("execution(public int com.atguigu.impl.MyMathCalculator.*(int, int))")
-
-
public static void logException() {
-
-
System.out.println("【xxxx】方法执行出现异常了,异常信息是:;这个异常已经通知测试小组进行排查");
-
-
}
-
-
-
-
-
//想在目标方法结束的时候执行
-
-
@After("execution(public int com.atguigu.impl.MyMathCalculator.*(int, int))")
-
-
public static void logEnd() {
-
-
System.out.println("【xxx】方法最终结束了");
-
-
}
AOP细节: