13ProxyFactoryBean、JdkDynamicAopProxy
2024-01-18 15:13:02 0 举报
jdk动态代理和cglib动态代理
作者其他创作
大纲/内容
newPrototypeInstance()
public void setBeanFactory(BeanFactory beanFactory) { this.beanFactory = beanFactory; checkInterceptorNames();}
利用DefaultAopProxyFactory创建AopProxy对象
JdkDynamicAopProxy
开始责任链调用
singleton ?
创建真正的代理对象
把我们的aop的advisor 转化为拦截器这里通过定义好的通知器链,返回一个拦截器列表是一个MethodInterceptor列表,执行顺序如下:ExposeInvocationInterceptor 内置的AspectJAroundAdvice @AroundMethodBeforeAdviceInterceptor @Before AspectJAfterAdvice @After AspectJAfterReturningAdvice @AfterReturningAspectJAfterThrowingAdvice @AfterThrowing
Object target = targetSource.getTarget()
ProxyFactoryBean
CglibAopProxy
ProxyCreatorSupport
getAopProxyFactory().createAopProxy(this)
找到spring中beanName满足该规则的Advisor和Interceptor
InvocationHandler
N
JDK动态代理必须基于接口,在调用动态代理对象的方法时底层会进入InvocationHandler.invoke()然后在通过反射调用原始对象的原始方法(原始对象可以通过TargetSource回调获取)
Y
Object retVal = new ReflectiveMethodInvocation().proceed()
FactoryBean<Object>
利用targetSource回调获取代理的原始对象,一般都直接从spring中获取就可以了
//把我们的代理对象暴露到线程变量中,用户可以通过代理对象继续调用代理的方法也会走invoke()
public Object getObject() throws BeansException { // 初始化通知器链 initializeAdvisorChain(); if (isSingleton()) { return getSingletonInstance(); } else { return newPrototypeInstance(); }}
AdvisedSupport
public void setTargetName(String targetName) { this.targetName = targetName;}
public void setInterceptorNames(String... interceptorNames) { this.interceptorNames = interceptorNames;}
//如果没有设置目标对象的代理接口,则使用CGLIB创建代理public void setProxyInterfaces(Class<?>[] proxyInterfaces) { setInterfaces(proxyInterfaces);}
在代理对象调用方法时,底层是InvocationHandler.invoke(),再利用反射调用原始对象的目标方法,而原始对象可以利用targetName或TargetSource.getObject()获取,对于懒加载获取对象的方式特别有用
getSingletonInstance()
AopProxy.getProxy()
创建动态代理对象的时机:1.正常的bean在完全初始化(postProcessAfterInitialization)之后会创建动态代理对象2.如果存在循环依赖的,会在实例化之后创建动态代理对象,将它注入给依赖它的bean,这个时候代理对象对应的原始对象的属性还没有被填充(也就是还没有被初始化)
if (this.advised.exposeProxy) { oldProxy = AopContext.setCurrentProxy(proxy); setProxyContext = true;}
initializeAdvisorChain()
JdkDynamicAopProxy.invoke()
AopProxy
addAdvisorOnChainCreation()
ProxyConfig
interceptorName.endsWith(\"*\") ?
遍历interceptorNames
0 条评论
下一页