在使用@AspectJ之前,首先必须保证所使用的Java版本是5.0及以上版本,否则无法使用注解技术。
Spring在处理@AspectJ注解表达式时,需要将Spring的asm模块添加到类路径中。asm是轻量级的字节码处理框架,因为Java的反射机制无法获取入参名,Spring就利用asm处理@AspectJ中所描述的方法入参。
此外,Spring采用AspectJ提供的@AspectJ注解类库及相应的解析类库,需要在pom.xml文件中添加aspectj.weaver和aspectj.tools类包的依赖。
AspectJ使用
①编写目标类
②编写切面
③通过AspectProxyFactory为目标类生成织入PreGreetingAspect切面代理
此外还可以通过xml配置的方式实现
不同的增强类型
①@Before
②AfterReturning
③Around
④AfterThrowing
⑤After
⑥DeclareParents
切点函数详解
切点函数是AspectJ表达式语言的核心,也是使用AspectJ进行切面定义的难点
@annotation():表示标注了某个注解的所有方法
例如:@AfterReturning("@annotation(com.smart.anno.NeedTest)") //后置增强切面
@execution()
1.通过方法签名定义切点
execution(public * *(..):匹配所有目标类的public方法,第一个*代表返回类型,第二个*代表方法签名,而..代表任意
入参。
execution(* *To(..)):匹配所有以To为后缀的方法。
2.通过类定义切点
execution(* com.smart.Waiter.*(..)):匹配Waiter接口的所有方法。
execution(* com.smart.Waiter+.*(..)):匹配Waiter接口的所有方法以及子类所特有的方法。
3.通过类包定义切点
execution(* com.smart.*(..)):匹配com.smart包下的所有类的所有方法。
execution(* com.smart..*(..)):匹配com.smart包、子包下所有类的所有方法。
execution(* com..*.*Dao.find*(..)):匹配包名前缀为com的任何包下类名后缀为Dao的方法,方法名
必须以find为前缀。