创建代理:
spring初始化目标bean之后,
exposedObject = this.initializeBean(beanName, exposedObject, mbd);
然后会执行对应BeanPostProccessor对象的方法,为目标bean生成代理,如下图
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if(bean != null) { Object cacheKey = this.getCacheKey(bean.getClass(), beanName); if(!this.earlyProxyReferences.contains(cacheKey)) {
//下面这个方法会循环所有的BeanPostProccessor,对bean进行wrapper,如果这是一个需要被代理的对象,
则会生成这个目标bean的代理 return this.wrapIfNecessary(bean, beanName, cacheKey); } } return bean; }使用jdk还是cg创建代理对象?
if(!config.isOptimize() && !config.isProxyTargetClass() && !this.hasNoUserSuppliedProxyInterfaces(config)) { return new JdkDynamicAopProxy(config); } else { Class targetClass = config.getTargetClass(); if(targetClass == null) { throw new AopConfigException("TargetSource cannot determine target class: Either an interface or a target is required for proxy creation."); } else { return (AopProxy)(targetClass.isInterface()?new JdkDynamicAopProxy(config):new ObjenesisCglibAopProxy(config)); } } }
advisedSupport.isOptimize()与advisedSupport.isProxyTargetClass()默认返回都是false,所以在默认情况下目标对象有没有实现接口决定着Spring采取的策略,
当然可以设置advisedSupport.isOptimize()或者advisedSupport.isProxyTargetClass()返回为true,这样无论目标对象有没有实现接口Spring都会选择使用CGLIB代理。