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

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

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

继上一篇文章的
AbstractAutowireCapableBeanFactory.class类,populateBean方法,
Spring -- 依赖注入源码分析(二)_第1张图片
上图中我们直接定位到红框的代码。
其中InstantiationAwareBeanPostProcessor是一个接口,
Spring -- 依赖注入源码分析(二)_第2张图片
实现类如图中黄框

下面我们debug 跟踪断点,进入
AutowiredAnnotationBeanPostProcessor.class类postProcessPropertyValues方法。图中beanName=我们的业务action
Spring -- 依赖注入源码分析(二)_第3张图片

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

下图,类中黄框再调用element.inject方法
Spring -- 依赖注入源码分析(二)_第4张图片
红框中InjectedElement为一个抽象类
Spring -- 依赖注入源码分析(二)_第5张图片

抽象类的子类(有多个子类,分别对类型或方法等进行依赖注入),如下图
Spring -- 依赖注入源码分析(二)_第6张图片
篮框中重写了抽象类中的方法。

贴出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 autowiredBeanNames = new LinkedHashSet(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进行了赋值(赋值实例化后的对象)。
Spring -- 依赖注入源码分析(二)_第7张图片


Spring -- 依赖注入源码分析(二)_第8张图片


Spring -- 依赖注入源码分析(二)_第9张图片

你可能感兴趣的:(框架技术,框架技术,spring,源码)