jdk动态代理模式(有接口的目标对象)
Object proxy =
Proxy.newProxyInstance(classloader,interfaces,InvocationHandler);
classloader —作用是加载jdk帮我们写出来的代理类的字节码 interfaces — 目标类的接口数组
InvocationHandler — 接口、自己写实现类
InvocationHandler.invoke(proxy , Method , args){
before();
//调用目标对象的目标方法
Method.invoke(target,args);
after();
}
//proxy ---代理对象本身
//Method --- 原对象的方法对象
//args --- Method方法的参数
cglib动态代理模式(没有接口和非final的目标对象)—ASM(生成和修改字节码的工具包)
Enhancer enhancer = new Enhancer();
enhancer.setSuperClass(目标对象的class对象);
enhancer.setCallback(MethodInterceptor的实现类);
Object proxy = enhancer.create();
MethodInterceptor的实现类.intercept(proxy , targetMethod , args , proxyMethod){
before();
//调用目标对象的目标方法
//Method.invoke(target,args);
methodProxy.invokeSuper(proxy, arg);
after();
}
spring aop产生代理对象的流程的入口
执行时机:发生在ioc三步创建流程中的第三步初始化之后去触发aop流程
AspectJAwareAdvisorAutoProxyCreator接口继承体系:
|-BeanPostProcessor
postProcessBeforeInitialization---初始化之前调用
postProcessAfterInitialization---初始化之后调用
|--InstantiationAwareBeanPostProcessor
postProcessBeforeInstantiation---实例化之前调用
postProcessAfterInstantiation---实例化之后调用
postProcessPropertyValues---后置处理属性值
|---SmartInstantiationAwareBeanPostProcessor
predictBeanType
determineCandidateConstructors
getEarlyBeanReference
|----AbstractAutoProxyCreator
postProcessBeforeInitialization
postProcessAfterInitialization----AOP功能入口
postProcessBeforeInstantiation
postProcessAfterInstantiation
postProcessPropertyValues
...
|-----AbstractAdvisorAutoProxyCreator
getAdvicesAndAdvisorsForBean
findEligibleAdvisors
findCandidateAdvisors
findAdvisorsThatCanApply
|------AspectJAwareAdvisorAutoProxyCreator
extendAdvisors
sortAdvisors
aop流程入口:
AbstractAutoProxyCreator#postProcessAfterInitialization
核心类:
AbstractAutoProxyCreator:负责创建代理对象的创建器
思考:
什么时候产生代理对象?
什么时候调用代理对象
有没有可能产生了代理对象,却没有调用过
源码入口:JdkDynamicAopProxy#invoke方法
重要代码分析:
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
Advisor和Advice的关系
Advice和MethodInterceptor的关系是什么?
Advice接口是MethodInterceptor的父接口
Advice有五个实现类,也就是五种通知,但是只有三种通知是实现MethodInterceptor接口
Advice另外的两个通知,要想和MethodInterceptor建立关系,需要使用适配器模式
AfterReturnningAdviceAdapter:【AspectJAfterReturnningAdvice----->MethodInterceptor】
MethodBeforeAdviceAdapter:【AspectJMethodBeforeAdviceAdvice----->MethodInterceptor】
ThrowsAdviceAdapter:【AspectJThrowsAdviceAdvice----MethodInterceptor】----没有被用到
Advice为什么要封装成MethodInterceptor?
一个目标对象可以被多个增强功能去增强,最终只会产生一个代理对象。
ReflectiveMethodInvocation的解析:
事务源码阅读