解析:
创建代理器
- 从DI开始,发现
AbstractAutowireCapableBeanFactory#doCreateBean是获取bean的方法-> - 通过aop的面向切面的特性,所以只要找到bean初始化的地方,查看
AbstractAutowireCapableBeanFactory#initializeBean方法->- 设置bean的相关属性,如名称,类加载器,所属容器等信息
- 初始化对象之前做的事情
applyBeanPostProcessorsBeforeInitialization - 初始化对象
invokeInitMethods - 初始化对象之后做的事情
applyBeanPostProcessorsAfterInitialization
- 设置后置处理器 初始化对象之后做的事情
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization->- 设置后置处理器的初始化方法
- 先从缓存中获取
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization->- 当后置处理器不存在的时候 包装传入的bean
-
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary包装bean->- 判断是否可以代理bean
- 获取通告advice 集合
- 进入创建代理对象的方法
-
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#createProxy创建代理对象->- 创建
proxyFactory - 设置Advisor
- 设置目标资源
- 创建代理对象
- 创建
-
org.springframework.aop.framework.ProxyFactory#getProxy(java.lang.ClassLoader)获取apoProxy -> -
org.springframework.aop.framework.ProxyCreatorSupport#createAopProxy获取创建代理对象的factory -> -
org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy创建代理对象的factory ->- 判断需要代理的类是否有接口
- 有接口返回jdk proxyFactory
- 不是的话返回cglib ProxyFactory
- 默认走jdk proxyFactory
- 判断需要代理的类是否有接口
-
org.springframework.aop.framework.JdkDynamicAopProxy#getProxy(java.lang.ClassLoader)真正创建代理对象的方法(只看jdk的)->- 获取代理对象的接口
- 设置equals和hashcode方法
- 通过Proxy创建代理类
调用具体的方法
-
org.springframework.aop.framework.JdkDynamicAopProxy#invoke代理对象的回调函数 ->因为
JdkDynamicAopProxy实现了InvocationHandler,所以只要找到当前类的invoke就可以了- 获取目标对象
- 获取advise的链信息
org.springframework.aop.framework.adapter.DefaultAdvisorAdapterRegistry类实现,并且保存到缓存- 包括
-
MethodBeforeAdviceAdapter之前的操作 -
AfterReturningAdviceAdapter之后的操作 -
ThrowsAdviceAdapter异常的操作
-
- 其他的拦截器
- 包括
- 循环切入点
- 找到符合切入点的方法
- 符合的话保存到集合
发起通知
-
org.springframework.aop.framework.ReflectiveMethodInvocation#proceed反射执行调用
AOP 使用案例
- 日志监控
- 事务处理
- 权限处理