继续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进行了赋值(赋值实例化后的对象)。