Spring AOP
切面是与业务功能垂直的
AOP的实现方式:
1、预编译 AspectJ
2、运行期动态代理(JDK动态代理,CGLib动态代理)
SpringAOP、JbossAop
概念
切面aspect:一个关注点模块化。比如事务切面。
连接点joinpoint:程序执行过程中特定的点。比如方法的开始。
通知Advice:在连接点上执行的动作
切入点PointCut:匹配连接点的断言。切点表达式
引入Introduction:在不修改类代码前提下,为类添加新的方法和属性
目标对象target Object:被一个或多个切面所通知的对象
AOP代理:Aop框架创建的对象。
织入weaving:把切面链接到其他的应用程序类型或者对象上
Advice类型
Before、After return、After throwing、After advice、Around、After
After advice:当连接点退出的时候执行的通知(不论是正常返回还是异常退出)
After时方法最后一条语句执行完执行,在return之后,在抛出异常之后
PointCut表达式
execution(public **(..)) 执行所有public方法
execution(* set*(..)) 执行所有set开始的方法
execution(* com.xyz.service.AccountService.*(..))执行AccountService类中所有的方法时
execution(* com.xyz.service..(..)) 执行com.xyz.service包下所有方法时
execution(* com.xyz.service...(..)) 执行com.xyz.service包和其子包下的所有方法时(3个点)
within(com.xyz.service.*)
within(com.xyz.service..*)
within用于匹配制定类型内的方法执行
this(com.xyz.service.AccountService) 用于匹配当前AOP代理对象类型的执行方法
target()目标类型匹配
args()参数类型匹配
@target()注解匹配
@annotation()
bean()
Around advice:
<aop:around method:"around" pointcut-ref="moocPointcut"/>
public Object around(ProceedingJoinPoint pjp){
Object obj = null;
try{
obj = pjp.proceed();
}catch(Throwable e){
e.printStackTrace();
}
}
introductions
允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象。
<aop:aspect..>
<aop:declare-parents types-matching="com.biz.*(+)"
implement-interface="com.fit"
default-impl="cpm.fitImpl"/>
</aop:aspect>
@Test
public void testFit(){
Fit fit = (Fit)super.getBean("aspectBiz");
fit.filter();
}
将com.biz下类添加了父类Fit及父类的实现
1、Advisor:充当Advice和Pointcut的适配器,类似使用Aspect的@Aspect注解的类(前一章节所述)。一般有advice和pointcut属性。
祖先接口为org.springframework.aop.Advisor,应用中可直接使用org.springframework.aop.support.DefaultPointcutAdvisor
1、Adivisor是一种特殊的Aspect,Advisor代表spring中的Aspect
2、区别:advisor只持有一个Pointcut和一个advice,而aspect可以多个pointcut和多个advice