最近在学习Spring AOP,就顺便看了一下Spring AOP的源码,这里记录一下,防止七秒钟的记忆。之前写过一篇关于Spring AOP的基本使用:Spring AOP 基本概念和使用,建议大家先去观看一下,再回来阅读这篇文章。
AOP是一种思想和理念,可以使用这种思想来简化代码开发的耦合性和难度,有句话说的好,天上飞的理念,必有落地的实现,那么实现了AOP这个思想的具体实现由Spring AOP和AspectJ技术,他们都是根据AOP的思想实现的。
Spring AOP和AspectJ的关系?
springAop、AspectJ都是Aop的实现,Spring AOP使用XML的格式进行配置的,SpringAop有自己的语法,但是语法复杂,所以SpringAop借助了AspectJ的注解(记住只是使用到了AspectJ的注解,而进行注解的解析工作是Spring内部实现的,所以Spring AOP只是借助了AspectJ的注解而已)。
spring AOP提供两种编程风格
@AspectJ support ------------>利用aspectj的注解
Schema-based AOP support ----------->xml aop:config 命名空间
证明:spring通过源码分析,我们可以知道spring底层使用的是JDK或者CGLIB来完成的代理,并且在官网上spring给出了aspectj的文档,和springAOP是不同的
关于Spring AOP的使用,Spring官网是推荐使用AspectJ来进行的,这里的源码分析也是分析基于注解使用的Spring AOP。
要能够使用AspectJ的注解,首先需要在配置上面添加@EnableAspectJAutoProxy,来增加对注解的解析,首先来看一下这个@EnableAspectJAutoProxy的源码。
代码块1:@EnableAspectJAutoProxy源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
/**
* Indicate whether subclass-based (CGLIB) proxies are to be created as opposed
* to standard Java interface-based proxies. The default is {@code false}.
*/
boolean proxyTargetClass() default false;
boolean exposeProxy() default false;
}
可以看到EnableAspectJAutoProxy注解上面有使用@Import向容器中导入了bean,这里就牵涉到@Import的使用了,感兴趣的同学可以参考:Spring为IOC容器注入Bean的方式,这里使用的是@