DI有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦。
散布于应用多处的功能被称为横切关注点。

spring对AOP的支持

Spring提供了4种类型的AOP支持:
1、基于代理的经典Spring AOP;
2、纯POJO切面;
3、@AspectJ注解驱动的切面;
4、注入式AspectJ切面
前三种都是SpringAOP实现的变体,SpringAOP构建在动态代理基础之上,因此Spring对AOP的支持局限于方法拦截。

编写切点
//execution:在方法执行时触发;*表示返回任意类型;..表示;使用任意参数
execution(* concert.Performance.perform(..))
使用注解创建切面

定义切面

使用@Aspect注解标注一个切面,使用@Pointcut注解能够在@AspectJ切面内定义可重用的切点。

注解 通知
@After 通知方法会在目标方法返回或者抛出异常后调用
@AfterReturning 通知方法会在目标方法返回后调用
@AfterThrowing 通知方法会在目标方法抛出异常后调用
@Around 通知方法会在将目标方法封装起来
@Before 通知方法会在目标方法调用之前执行

在javaconfig中启用AspectJ注解的自动代理

如果不启用自动代理功能,定义的切面只会是一个普通的bean,spring不会把它当做切面来处理。

//启用AspectJ自动代理
@EnableAspectJAutoProxy

在XML中启用AspectJ自动代理

<!--启用AspectJ自动代理-->
<aop:aspectj-autoproxy />