在Spring中配置@AspectJ
- 对@AspectJ支持可以使用XML或Java风格的配置
- 确保AspectJ的aspectweaver.jar库包含在应用程序(版本1.6.8或更高版本)的classpath中
- @纵横切面使用方面注解配置,拥有@Aspect的任何豆将被弹簧自动识别并应用
- 用@Aspect注解的类可以有方法和字段,他们也可能包括切入点(切入点),通知(咨询)和引用(介绍)声明
- @Aspect注解时不能够通过类路径自动检测发现的,所以需要配合使用组件注释或者在xml配置bean
pointcut
- 一个切入点通过一个普通的方法定义来提供,并且切入点表达式使用@Pointcut注解,方法返回类型必须为void
定义一个名为’anyOldTransfer’,这个切入点将匹配任何名为“transfer”的方法的执行
支持的切入点指示符
- execution:匹配方法执行的连接点
- within:限定匹配特定类型的连接点
- this:匹配特定连接点的豆引用是指 类型实例的限制
- target:限定匹配特定连接点的目标对象是指定类型的实例
- args:限定匹配特定连接点的参数是给定类型的实例
- @target:限定匹配特定连接点的类执行给定类型的注解
- @args:限定匹配特定连接点实际传入参数的类型具有给定类型的注解
- @within:限定匹配到内具有给定的注释类型的连接点
- @annotation:限定匹配特定连接点的主题具有给定的注解
组合切入点
- 切入点表达式可以通过&&,||和!进行组合,也可以通过名字引用切入点表达式-
- 通过组合,可以建立更加复杂的切入点表达式
- @Pointcut( “anyPublicOperation()&& inTrading()”)“
定义良好的切入点
- Aspectj是编译期的AOP
- 检查代码并匹配连接点与切入点的代价是昂贵的
- 一个好的切入点应该包括以下几点
1、选择特定类型的连接点,如:execution,get,set,call,handler
2、确定连接点范围,如:within,withincode
3、匹配上下文信息,如:this,target, @ annotation
Stpring AOP可以处理泛型类的声明和使用方法的参数
- 通知和切入点注解有一个额外的“argNames”属性,它 可以用来指定所注解的方法的参数名
- 如果第一参数是一个JoinPoint,ProceedingJoinPoint,JoinPoint.StaticPart,那么可以忽略它
简介
- 允许一个切面声明一个通知对象实现制定接口,并且提供了一个接口实现类来代表这些对象
- introduction使用@DeclareParents进行注解,这个注解用来定义匹配的类型拥有一个新的parent
- 例如:给定一个接口UsageTracked,并且该接口拥有DefaultUsageTracked的实现,接下来的切面声明了所有的service接口的实现都实现了UsageTracked接口
@Aspect
public class UsageTracking {
@DeclareParents(value =“main.java.com.service.* +",defaultImpl = DefaultUsageTracked.class)
public static UsageTracked usageTracked;
@Before("main.java.com.SystemArchitecture.busineddService()&& this(usageTracked)")
public void recordUsage(UsageTracageTracked){
usageTracked.incrementUseCount();
}
切面实例化模型
- 这是一个高级主题
- “perthis”切面通过指定@Aspect注解perthis子句实现
- 每个独立的service对象执行时对会创建一个切面实例
- service对象的每个方法在第一次执行的时候创建切面实例,切面在service对象失效的同时也失效
AspectJ小结
- 配置@AspectJ
- Pointcut连接点
- Advice通知