一、特点
关注点分离:不同的问题交给不同的部分去解决
- 面向切面编程AOP正式此种技术的体现
- 通用化功能代码的实现,对应的就是所谓的切面(Aspest)
- 业务功能代码和切面代码分开后,架构将变得高内聚低耦合
- 确保功能的完整性:切面最终需要被合并到业务中(Weave)
二、AOP的三种织入方式
- 编译时织入:需要特殊的Java编译器,如AspectJ
- 类加载时织入:需要特殊的Java编译器,如AspectJ和AspectWerkz
- 运行时织入:Spring采用的方式,通过动态代理的方式,实现简单
三、AOP的主要名词概念
- Aspect:通用功能的代码实现
- Target:被织入Aspect的对象
- Join Point:可以作为切入点的机会,所有方法都可以作为切入点
- Pointcut:Aspect实际被应用在的Join Point,支持正则
- Advice:类里的方法以及这个方法如何织入到目标方法的方式
- Weaving:Aop的实现过程
四、AOP原理
1、AOP实现
JdkProxy
和Cglib
- 由AopProxyFactory根据AdvisedSupport对象的配置来决定
- 默认策略如果目标类是接口,则用JDKProxy来实现,否则用后者
- JDKProxy的核心:InvocationHandler接口和Proxy类
- 通过Java的内部反射机制实现
- 反射机制在生成类的过程中比较高效
- Cglib:以继承的方式动态生成目标类的代理
2、代理模式
3、Spring里的代理模式的实现
- 真实实现类的逻辑包含在了getBean方法里
- getBean方法返回的实际上是Proxy的实例
- Proxy实例是Spring 采用JDK Proxy或CGLIB动态生成的
源码线索:
- AbstractAutowireCapableBeanFactory#doCreateBean
- AbstractAutowireCapableBeanFactory#initializeBean(beanName, exposedObject, mbd)
- AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)
- AbstractAutoProxyCreator#postProcessAfterInitialization
- AbstractAutoProxyCreator#wrapIfNecessary(bean, beanName, cacheKey)
- AbstractAutoProxyCreator#createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean))
- AbstractAutoProxyCreator#getProxy(classLoader)
- ProxyFactory#createAopProxy().getProxy(classLoader)
- DefaultAopProxyFactory#createAopProxy