XML配置下Spring Bean的注入

主题

之前学习了@Autowired下SpringBean是怎么注入到属性中的.

https://www.cnblogs.com/abcwt112/p/12541783.html

现在学习下远古时代的XML是怎么注入的.

 

Ac初始化

 

入口是XML的AC.

new的时候回做refresh方法

 

refresh之前的文章分享过大致做了什么

https://www.cnblogs.com/abcwt112/p/12388982.html

 

 

 其中这一步会去掉BeanFactory的getBean方法去初始化配置的bean.

 

 

 

属性注入

BF的getBean里面有无数逻辑.其中注入属性的是这一段

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean

 1 /**
 2      * Populate the bean instance in the given BeanWrapper with the property values
 3      * from the bean definition.
 4      * @param beanName the name of the bean
 5      * @param mbd the bean definition for the bean
 6      * @param bw the BeanWrapper with bean instance
 7      */
 8     @SuppressWarnings("deprecation")  // for postProcessPropertyValues
 9     protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
10         if (bw == null) {
11             if (mbd.hasPropertyValues()) {
12                 throw new BeanCreationException(
13                         mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
14             }
15             else {
16                 // Skip property population phase for null instance.
17                 return;
18             }
19         }
20 
21         // Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
22         // state of the bean before properties are set. This can be used, for example,
23         // to support styles of field injection.
24         boolean continueWithPropertyPopulation = true;
25 
26         if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
27             for (BeanPostProcessor bp : getBeanPostProcessors()) {
28                 if (bp instanceof InstantiationAwareBeanPostProcessor) {
29                     InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
30                     if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
31                         continueWithPropertyPopulation = false;
32                         break;
33                     }
34                 }
35             }
36         }
37 
38         if (!continueWithPropertyPopulation) {
39             return;
40         }
41 
42         PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
43 
44         int resolvedAutowireMode = mbd.getResolvedAutowireMode();
45         if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
46             MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
47             // Add property values based on autowire by name if applicable.
48             if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
49                 autowireByName(beanName, mbd, bw, newPvs);
50             }
51             // Add property values based on autowire by type if applicable.
52             if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
53                 autowireByType(beanName, mbd, bw, newPvs);
54             }
55             pvs = newPvs;
56         }
57 
58         boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
59         boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
60 
61         PropertyDescriptor[] filteredPds = null;
62         if (hasInstAwareBpps) {
63             if (pvs == null) {
64                 pvs = mbd.getPropertyValues();
65             }
66             for (BeanPostProcessor bp : getBeanPostProcessors()) {
67                 if (bp instanceof InstantiationAwareBeanPostProcessor) {
68                     InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
69                     PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
70                     if (pvsToUse == null) {
71                         if (filteredPds == null) {
72                             filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
73                         }
74                         pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
75                         if (pvsToUse == null) {
76                             return;
77                         }
78                     }
79                     pvs = pvsToUse;
80                 }
81             }
82         }
83         if (needsDepCheck) {
84             if (filteredPds == null) {
85                 filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
86             }
87             checkDependencies(beanName, mbd, filteredPds, pvs);
88         }
89 
90         if (pvs != null) {
91             applyPropertyValues(beanName, mbd, bw, pvs);
92         }
93     }

如果XML里bean是这样配置的:

 

 

 其中最后91行的 applyPropertyValues(beanName, mbd, bw, pvs);

就是把对象中的属性(pvs)转化成对象,设置到bw(BeanWrapper.封装了原始对象)中去.

比如beanName是a.     pvs是a对象里的属性集,其中包含b

具体逻辑是调用Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue); 来获取要注入的属性对应的bean.

 

 

 最终也是通过BF.getBean去取Bean.再set到beanwrapper上去.

 

XML配置中还有一种情况是使用默认的自动配置

 

这个时候bean的属性是不需要配置的.spring会自动根据类型(byType)或者名称(byName)去匹配.

原理是在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean中

 

 1         int resolvedAutowireMode = mbd.getResolvedAutowireMode();
 2         if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
 3             MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
 4             // Add property values based on autowire by name if applicable.
 5             if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
 6                 autowireByName(beanName, mbd, bw, newPvs);
 7             }
 8             // Add property values based on autowire by type if applicable.
 9             if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
10                 autowireByType(beanName, mbd, bw, newPvs);
11             }
12             pvs = newPvs;
13         }

resolvedAutowireMode默认情况下是0.是不会自动装配的.如果配置了就会进对应的autowiredByXXX方法.会找出missing property values然后设置到MutablePropertyValues中.所以最后掉applyPropertyValues方法的时候还是会填充这些属性.

 

posted @ 2020-03-24 10:16  abcwt112  阅读(650)  评论(0编辑  收藏  举报