image.png

AOP 作用:

只关注业务逻辑,其他非功能代码,通过切面去实现

  • 日志
  • 权限
  • 事务:事务的 commit 和回滚应该自动由 AOP 完成,DAO 层的方法只需要关注业务

AOP 底层选择:

Spring AOP 会根据被代理类:

  • 实现了接口,则使用 JDK Dynamic Proxy
  • 没有实现接口,则使用 CGLib

源码:

IoC refresh 的时候,就会创建代理对象,并加入容器中,而原始对象不存在。
image.png

doGetBean() -> initializeBean() -> applyBeanPostProcessorsAfterInitialization()
AbstractAutowireCapableBeanFactory:

  • 调用后置处理器:BeanPostProcessor

image.png
AnnotationAwareAspectJAutoProxyCreator:

  • AbstractAutoProxyCreator.postProcessAfterInitialization()

image.png

DefaultAopProxyFactory.createAopProxy():

  • 判断注解配置或者目标类是否实现接口,来选择 JDK Dynamic Proxy 还是 CGLib

image.png


为什么 JDK 动态代理要求接口?

因为通过动态字节码生成的类,需要继承 Proxy 这个类,而 Java 只支持单继承,所以要求目标类实现接口,并且引用的类也是接口。
image.png