spring源代码-aop

创建代理:

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代理。
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值