什么是Aop
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,利用AOP可以对业务逻辑进行增强,最常见的例子是我们可以在执行方法的前后打上日志,传统方式可能需要在每个方法前后进行硬编码,耦合度很高且不好维护,而AOP的出现正好可以解决这个问题。
AOP是一种思想,springAop和aspectJ都是AOP一种具体实现,官网图片
但由于springAop实现的语法对开发者不友好,所以借鉴了aspectJ的语法,提供springAOP的支持,注意并不是使用了aspectJ,只是借鉴语法
为什么能够对所有的方法做统一管理呢
spring利用了代理对象,生成代理对象的前后可以做一些特殊处理,所以最终把代理对象交给spring容器管理
AOP简单代码例子
@Configuration
@ComponentScan("com.aop")
// 开启AspectJ的语法对aop的支持
@EnableAspectJAutoProxy
public class AppConfig {
}
需要增强的方法
@Component
public class IndexDao {
// 在这个方法前后进行增强,每个方法都是一个连接点
public void query() {
System.out.println("查询数据库");
}
}
声明切面,对方法做增强
@Component
@Aspect // 表示是一个切面
public class TestAspect {
// 切点 方法集合
@Pointcut("execution(* com.aop.dao.*.*(..))")
public void pointCut() {
}
// 通知
@Before("pointCut()")
public void doAccessCheck() {
System.out.println("do before");
}
}
测试类
public class Test {
public static void main(String[] args) {
// 是在这里就完成了动态代理,原因是在下面的getBean源码中找着找着就会找到这里的代码
AnnotationConfigApplicationContext annotationConfigApplicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
// 由于这个类的输出和原本不同,是使用了代理对这个类做了改变
// spring是使用了jdk cglib动态代理
IndexDao bean = annotationConfigApplicationContext.getBean(IndexDao.class);
bean.query();
}
}
源码分析
首先看AopProxy
接口,可以看到动态代理有三种实现方式
接下来是找创建代理的过程
进入AbstractBeanFactory
点进去createBean
方法,可以看到
继续进去
继续进去
可以看到这里会有多个后置处理器,而真正处理代理的就是{AnnotationAwareAspectJAutoProxyCreator
这个处理,经过这个处理器后返回的就是代理对象了
所以接下来源码就直接去找这个AbstractAutoProxyCreator
类的createProxy
方法
最终就能找到是使用了哪个代理了
以上是简单的了解,更多细节需后续加强