Spring -- 依赖注入源码分析(二)

继续http://blog.csdn.net/gaopeng0071/article/details/54582979
之后我们来分析使用注解进行注入,源码是如何工作的。

参考资料:http://blog.csdn.net/chjttony/article/details/6301591

继上一篇文章的
AbstractAutowireCapableBeanFactory.class类,populateBean方法,
这里写图片描述
上图中我们直接定位到红框的代码。
其中InstantiationAwareBeanPostProcessor是一个接口,
这里写图片描述
实现类如图中黄框

下面我们debug 跟踪断点,进入
AutowiredAnnotationBeanPostProcessor.class类postProcessPropertyValues方法。图中beanName=我们的业务action
这里写图片描述

关注上图红框,调用InjectionMetadata.class类inject方法。

下图,类中黄框再调用element.inject方法
这里写图片描述
红框中InjectedElement为一个抽象类
这里写图片描述

抽象类的子类(有多个子类,分别对类型或方法等进行依赖注入),如下图
这里写图片描述
篮框中重写了抽象类中的方法。

贴出inject方法的代码,

        @Override
        protected void inject(Object bean, String beanName, PropertyValues pvs) throws Throwable {
            Field field = (Field) this.member;
            try {
                Object value;
                if (this.cached) {
                    value = resolvedCachedArgument(beanName, this.cachedFieldValue);
                }
                else {
                    DependencyDescriptor desc = new DependencyDescriptor(field, this.required);
                    desc.setContainingClass(bean.getClass());
                    Set<String> autowiredBeanNames = new LinkedHashSet<String>(1);
                    TypeConverter typeConverter = beanFactory.getTypeConverter();
                    value = beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter);
                    synchronized (this) {
                        if (!this.cached) {
                            if (value != null || this.required) {
                                this.cachedFieldValue = desc;
                                registerDependentBeans(beanName, autowiredBeanNames);
                                if (autowiredBeanNames.size() == 1) {
                                    String autowiredBeanName = autowiredBeanNames.iterator().next();
                                    if (beanFactory.containsBean(autowiredBeanName)) {
                                        if (beanFactory.isTypeMatch(autowiredBeanName, field.getType())) {
                                            this.cachedFieldValue = new RuntimeBeanReference(autowiredBeanName);
                                        }
                                    }
                                }
                            }
                            else {
                                this.cachedFieldValue = null;
                            }
                            this.cached = true;
                        }
                    }
                }
                if (value != null) {
                    ReflectionUtils.makeAccessible(field);
                    field.set(bean, value);
                }
            }
            catch (Throwable ex) {
                throw new BeanCreationException("Could not autowire field: " + field, ex);
            }
        }
    }

代码中的
field.set(bean, value);
通过JDK提供的Field类完成了属性的赋值,实现类注解的依赖注入。
方法中其他方法,可以参照http://blog.csdn.net/chjttony/article/details/6301591,这篇讲解很详细,每一行代码都做了注释。

下图是,这行代码断点的值。可以看到将Action中的paymentService进行了赋值(赋值实例化后的对象)。
这里写图片描述


这里写图片描述


这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值