@Lazy

@Lazy

Lazy注解会通过ProxyFactoty拿到一个被注解的代理对象,然后在使用使用的时被代理对象时,且这时才会创建被代理对象。

protected Object buildLazyResolutionProxy(final DependencyDescriptor descriptor, @Nullable final String beanName) {
    BeanFactory beanFactory = this.getBeanFactory();
    Assert.state(beanFactory instanceof DefaultListableBeanFactory, "BeanFactory needs to be a DefaultListableBeanFactory");
    final DefaultListableBeanFactory dlbf = (DefaultListableBeanFactory)beanFactory;
    TargetSource ts = new TargetSource() {
        public Class<?> getTargetClass() {
            return descriptor.getDependencyType();
        }

        public boolean isStatic() {
            return false;
        }

        public Object getTarget() {
            Set<String> autowiredBeanNames = beanName != null ? new LinkedHashSet(1) : null;
        	//获取被代理对象
            Object target = dlbf.doResolveDependency(descriptor, beanName, autowiredBeanNames, (TypeConverter)null);
            if (target == null) {
                Class<?> type = this.getTargetClass();
                if (Map.class == type) {
                    return Collections.emptyMap();
                } else if (List.class == type) {
                    return Collections.emptyList();
                } else if (Set.class != type && Collection.class != type) {
                    throw new NoSuchBeanDefinitionException(descriptor.getResolvableType(), "Optional dependency not present for lazy injection point");
                } else {
                    return Collections.emptySet();
                }
            } else {
                if (autowiredBeanNames != null) {
                    Iterator var3 = autowiredBeanNames.iterator();

                    while(var3.hasNext()) {
                        String autowiredBeanName = (String)var3.next();
                        if (dlbf.containsBean(autowiredBeanName)) {
                            dlbf.registerDependentBean(autowiredBeanName, beanName);
                        }
                    }
                }

                return target;
            }
        }

        public void releaseTarget(Object target) {
        }
    };
    //创建代理对象
    ProxyFactory pf = new ProxyFactory();
    pf.setTargetSource(ts);
    Class<?> dependencyType = descriptor.getDependencyType();
    if (dependencyType.isInterface()) {
        pf.addInterface(dependencyType);
    }

    return pf.getProxy(dlbf.getBeanClassLoader());
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值