Spring AOP基本概念
- 是一种动态编译期增强性AOP的实现
- 与IOC进行整合,不是全面的切面框架
- 与动态代理相辅相成
- 有两种实现:基于jdk动态代理、cglib
Spring AOP与AspectJ区别
- Spring的AOP是基于动态代理的,动态增强目标对象,而AspectJ是静态编译时增强,需要使用自己的编译器来编译,还需要织入器
- 使用AspectJ编写的java代码无法直接使用javac编译,必须使用AspectJ增强的ajc增强编译器才可以通过编译,写法不符合原生Java的语法;而Spring AOP是符合Java语法的,也不需要指定编译器去编译,一切都由Spring 处理。
JDK动态代理与Cglib的区别
- jdk的动态代理需要实现接口 InvocationHandler
- cglib无需实现接口,使用字节码技术去修改class文件使继承
- spring默认使用jdk动态代理,如果没有实现接口会使用cglib
使用步骤
- 定义业务组件
- 定义切点(重点)
- 定义增强处理方法(切面方法)
依赖
jar包依赖,除此以外还有spring依赖
- aspectjweaver.jar
- aspectjrt.jar
- aspectj.jar
- aopalliance.jar
maven依赖
<dependencies> <!-- 有此依赖会远程下载其它相关依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.9.RELEASE</version> </dependency> <!-- aspectJ AOP 织入器 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.9</version> </dependency> </dependencies>注解方式开发
- 扫描Aspect增强的类
<context:component-scan base-package=""> <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/> </context:component-scan>- 开启@AspectJ支持
<aop:aspectj-autoproxy/> - 使用@AspectJ注解来标记一个切面类(spring不会将切面注册为Bean也不会增强,但是需要扫描)
- 使用其它注解进行开发(如下)
常用注解的使用
- @Before:在切点方法前执行
- 在增强的方法上
@Before("execution(* 包名.*.*(..))") - 上述表达式可使用pointcut或切入表达式,效果一致,之后不再赘述
- 切点方法没有形参与返回值
- 在增强的方法上
示例代码
@Aspect public class AuthAspect { //定义切点 @Pointcut("execution(* com.cnblogs.hellxz.service.*.*(..))")
