AOP 作用:
只关注业务逻辑,其他非功能代码,通过切面去实现
- 日志
- 权限
- 事务:事务的 commit 和回滚应该自动由 AOP 完成,DAO 层的方法只需要关注业务
AOP 底层选择:
Spring AOP 会根据被代理类:
- 实现了接口,则使用 JDK Dynamic Proxy
- 没有实现接口,则使用 CGLib
源码:
IoC refresh 的时候,就会创建代理对象,并加入容器中,而原始对象不存在。
doGetBean() -> initializeBean() -> applyBeanPostProcessorsAfterInitialization()
AbstractAutowireCapableBeanFactory:
- 调用后置处理器:BeanPostProcessor
AnnotationAwareAspectJAutoProxyCreator:
- AbstractAutoProxyCreator.postProcessAfterInitialization()
DefaultAopProxyFactory.createAopProxy():
- 判断注解配置或者目标类是否实现接口,来选择 JDK Dynamic Proxy 还是 CGLib
为什么 JDK 动态代理要求接口?
因为通过动态字节码生成的类,需要继承 Proxy 这个类,而 Java 只支持单继承,所以要求目标类实现接口,并且引用的类也是接口。