spring aop (中下)创建代理

时间:2022-06-23
本文章向大家介绍spring aop (中下)创建代理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

参考

Spring AOP 创建代理的源码解析

判断代理方式

还是接着上面,AnnotationAwareAspectJAutoProxyCreator.postProcessAfterInitialization->wrapIfNecessary->createProxy内调用了proxyFactory.getProxy(getProxyClassLoader());(ProxyFactory.getProxy),getProxy内部调用了createAopProxy().getProxy(classLoader);也就是说,外界操作的都是getProxy的返回值,一个代理对象。代理对象的方法调用会被拦截。 所以我们分析createAopProxy(DefaultAopProxyFactory.createAopProxy),它在内部内有判断。 其中的:

if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
  return new JdkDynamicAopProxy(config);
}
return new ObjenesisCglibAopProxy(config);

说明,如果被代理的是接口,就用jdk,否则用cglib。也就是说,我们平时在Service实现类上加注解,则会用cglib。而mybatis根据mapper注册的Bean,是以MapperProxy生成的代理类对象,targetClass.isInterface()判断为假,但Proxy.isProxyClass(targetClass)判断为真,所以会用jdk。

最终,根据情况创建JdkDynamicAopProxy或ObjenesisCglibAopProxy对象

获取代理对象

在判断代理方式后,会创建JdkDynamicAopProxy或ObjenesisCglibAopProxy对象,并调用getProxy方法,获取代理对象。 ObjenesisCglibAopProxy对象会调用父类CglibAopProxy的getProxy方法。

如此,代理对象已创建。

两种代理对象

两种代理对象JdkDynamicAopProxy和ObjenesisCglibAopProxy,都会拦截外界的方法调用。 做一个合格的程序猿之浅析Spring AOP源码(十五) 分析JdkDynamicAopProxy的invoke方法