AOP是面向对象编程的一种补充。面向对象是对现实场景进行自上而下的抽象和建模,最小粒度是对象,至于对象内部则无能为力,AOP可以深入对象内部,具体来说是方法内部进行监控。
使用AOP好处:
(1)将与具体业务无关的公共行为封装成独立模块,并影响业务类,最大限度减少代码重复冗余
(2)AOP在不干扰具体业务逻辑的基础上实现业务需求横向扩展,比如监控系统所有接口方法的调用时间、入参/监控所有接口方法的执行时间/事物实现/日志实现
1、 代理框架:AspectJ、Spring AOP
(1) AspectJ:一套独立的面向切面编程的解决方案,编译时对目标类进行增强
(2) Spring AOP:运行时生成目标类的代理类
(3) Spring AOP与AspectJ关系:Spring AOP使用了AspectJ的Annotation。使用了Aspect来定义切面,使用Pointcut来定义切入点,使用Advice来定义增强处理。虽然使用了Aspect的Annotation,但是并没有使用它的编译器和织入器
2、 代理方式:JDK 动态代理、CGLIB
(1) JDK动态代理:代理类和实际类必须实现同一个接口,动态创建代理类
如何配置:
(2) CGLIB:代理类是实际类的子类,动态创建代理类
如何配置:
(3) Spring AOP默认使用JDK动态代理
3、 Spring Aop中 : before after afterReturn after Throwing around 的原理及区别
@Before是在方法被调用之前执行
@AfterReturn是在方法被调用后,return之前
@AfterThrowing是在方法被调用发生异常时
@After是在方法被调用后,return之后
@Around可以灵活控制使用:(1)实现方法失败重调;(2)统计方法执行时间
4、 AOP实践
(1)依赖jar包:
aspectjrt.jar,
aspectjweaver.jar,
aspectj.jar,
aopalliance.jar
(2)注解方式:declaring aspects as regular Java classes annotated with Java 5 annotations
具体步骤:
在spring配置文件中声明
定义带有@Aspect注解的 java类
(3)xml方式:@Aspect、@Pointcut、@Before等均定义在xml中
具体步骤:
在Spring配置文件中声明
定义不带有@Aspect注解的java类