面向切面的Spring
系统中的日志,安全和事务管理等散布在系统多处的功能被称为横切关注点,这些横切关注点从概念上是与应用的业务逻辑相分离的,但是往往会直接嵌入到应用的业务逻辑中,把这些横切关注点与业务逻辑相分离是面向切面编程(AOP)所要解决的问题。
AOP可以实现横切关注点与它们所影响的对象之前的解耦。
横切关注点往往被模块化为通用的模块,如果要重用通用的功能的话,最常见的面向对象技术是继承和委托,但是,如果在整个应用中都使用相同基类,继承往往会导致一个脆弱的对象体系,而使用委托往往需要对委托对象进行复杂的调用。
切面提供了渠道继承和委托的另一种可选方案,在使用面向切面编程时,我们仍然在一个地方定义调用功能,但是可以通过声明的方式定义这个功能要以何种方式在何处应用,而无需修改受影响的类。
横切关注点可以被模块化为特殊的类,这些类被称为切面。
AOP术语
1.通知(Advice)
切面的工作被称为通知,通知定义了切面的工作是什么以及何时使用。
5种类型的通知:
前置通知@Before:通知方法(工作)会在目标方法调用之前执行。
后置通知@After:通知方法(工作)会在目标方法返回调用,不会关心方法的输出是什么。
返回通知@AfterReturing:通知方法(工作)会在目标方法返回后调用。
异常通知@AfterThrowing:通知方法(工作)会在目标方法调用抛出异常后调用。
环绕通知@Around:通知方法(工作)包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
2.连接点(Join point)切面
连接点是在应用执行过程中能够插入切面的一个点,这个点可以是调用方法时。
3.切点(Pointcut)
切点定义了何处,会匹配通知要织入的一个或多个连接点。
4.切面(Aspect)
切面是通知和切点的结合,通知和切点共同定义了切面的全面内容,它是什么,在何时和何处完成其功能。
5.引入(Introduction)
6.织入(Weaving)
在运行期,切面在指定的连接点被织入到目标对象。
使用注解创建切面
1.定义切点
@Pointcut(execution())注解能够在一个@AspectJ切面内定义可重用的切点
2.定义切面
@Aspect注解一个POJO,类中有用AspectJ注解如@Before,@After等声明的通知方法,注解中可放入切点表达式。
通知方法代表切面的具体工作和何时使用,切点代表了何处使用。
环绕通知
1.创建环绕通知
通知方法接受ProceedingJoinPoint作为参数,这个对象是必须要有的,你要在通知中通过它来调用被通知的方法。
2.处理通知中的参数
方法名(类型)&& agrs(参数名),表面传递给方法的某类型的参数也会传递到通知中去
SpringAOP与AspectJ是不同框架,SpringAOP是Spring借鉴了AspectJ的切面,以提供注解驱动的AOP。