1515
1616接下来的文章会更加深入剖析Bean容器如何解析xml,注册和初始化bean,以及如何获取bean实例等详细的过程。
1717
18- 转自:[ http://www.importnew.com/19243.html ] ( http://www.importnew.com/19243.html )
18+ > 转自:[ http://www.importnew.com/19243.html ] ( http://www.importnew.com/19243.html )
1919
20201\. 初始化
2121
3737```
3838
3939加载时需要读取、解析、注册bean,这个过程具体的调用栈如下所示:
40- [ ![ ] ( https://cloud.githubusercontent.com/assets/1736354/7896285/8a488060-06e6-11e5-9ad9-4ddd3375984f.png " load ")] ( https://cloud.githubusercontent.com/assets/1736354/7896285/8a488060-06e6-11e5-9ad9-4ddd3375984f.png " load " )
40+ ![ ] ( https://cloud.githubusercontent.com/assets/1736354/7896285/8a488060-06e6-11e5-9ad9-4ddd3375984f.png )
4141
4242下面对每一步的关键的代码进行详细分析:
4343
4646保存配置位置,并刷新
4747在调用ClassPathXmlApplicationContext后,先会将配置位置信息保存到configLocations,供后面解析使用,之后,会调用` AbstractApplicationContext ` 的refresh方法进行刷新:
4848
49- ```
49+ ``` java
5050public ClassPathXmlApplicationContext(String [] configLocations, boolean refresh,
5151 ApplicationContext parent) throws BeansException {
5252
@@ -101,7 +101,7 @@ public void refresh() throws BeansException, IllegalStateException {
101101
102102创建载入BeanFactory
103103
104- ```
104+ ``` java
105105protected final void refreshBeanFactory() throws BeansException {
106106 // ... ...
107107 DefaultListableBeanFactory beanFactory = createBeanFactory();
@@ -113,7 +113,7 @@ protected final void refreshBeanFactory() throws BeansException {
113113
114114创建XMLBeanDefinitionReader
115115
116- ```
116+ ``` java
117117protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
118118 throws BeansException , IOException {
119119 // Create a new XmlBeanDefinitionReader for the given BeanFactory.
@@ -129,7 +129,7 @@ protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
129129
130130创建处理每一个resource
131131
132- ```
132+ ```java
133133public int loadBeanDefinitions(String location, Set<Resource > actualResources)
134134 throws BeanDefinitionStoreException {
135135 // ... ...
@@ -152,7 +152,7 @@ public int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStore
152152
153153处理XML 每个元素
154154
155- ```
155+ ```java
156156protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
157157 // ... ...
158158 NodeList nl = root. getChildNodes();
@@ -175,7 +175,7 @@ protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate d
175175
176176解析和注册bean
177177
178- ```
178+ ```java
179179protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
180180 // 解析
181181 BeanDefinitionHolder bdHolder = delegate. parseBeanDefinitionElement(ele);
@@ -201,11 +201,11 @@ protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate d
201201
202202## 解析
203203
204- [ ![ ] ( https://cloud.githubusercontent.com/assets/1736354/7896302/eae02bc6-06e6-11e5-941a-d1f59e3b363f.png " process ")] ( https://cloud.githubusercontent.com/assets/1736354/7896302/eae02bc6-06e6-11e5-941a-d1f59e3b363f.png " process " )
204+ ! [](https: // cloud.githubusercontent.com/assets/1736354/7896302/eae02bc6-06e6-11e5-941a-d1f59e3b363f.png)
205205
206206处理每个Bean 的元素
207207
208- ```
208+ ```java
209209public AbstractBeanDefinition parseBeanDefinitionElement(
210210 Element ele, String beanName, BeanDefinition containingBean) {
211211
@@ -230,7 +230,7 @@ public AbstractBeanDefinition parseBeanDefinitionElement(
230230
231231处理属性的值
232232
233- ```
233+ ```java
234234public Object parsePropertyValue(Element ele, BeanDefinition bd, String propertyName) {
235235 String elementName = (propertyName != null ) ?
236236 " <property> element for property '" + propertyName + " '" :
@@ -264,7 +264,7 @@ public Object parsePropertyValue(Element ele, BeanDefinition bd, String property
264264
2652651.4 注册
266266
267- ```
267+ ```java
268268public static void registerBeanDefinition(
269269 BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
270270 throws BeanDefinitionStoreException {
@@ -299,7 +299,7 @@ public void registerBeanDefinition(String beanName, BeanDefinition beanDefinitio
299299
300300## 注册
301301
302- ```
302+ ```java
303303 public static void registerBeanDefinition(
304304 BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
305305 throws BeanDefinitionStoreException {
@@ -338,19 +338,19 @@ public void registerBeanDefinition(String beanName, BeanDefinition beanDefinitio
338338### 注入依赖
339339
340340当完成初始化IOC 容器后,如果bean没有设置lazy- init(延迟加载)属性,那么bean的实例就会在初始化IOC 完成之后,及时地进行初始化。初始化时会先建立实例,然后根据配置利用反射对实例进行进一步操作,具体流程如下所示:
341- [ ![ ] ( https://cloud.githubusercontent.com/assets/1736354/7929429/615570ea-0930-11e5-8097-ae982ef7709d.png " bean_flow ")] ( https://cloud.githubusercontent.com/assets/1736354/7929429/615570ea-0930-11e5-8097-ae982ef7709d.png " bean_flow " )
341+ ! [](https: // cloud.githubusercontent.com/assets/1736354/7929429/615570ea-0930-11e5-8097-ae982ef7709d.png)
342342
343343创建bean的实例
344344创建bean的实例过程函数调用栈如下所示:
345- [ ![ ] ( https://cloud.githubusercontent.com/assets/1736354/7929379/cec01bcc-092f-11e5-81ad-88c285f33845.png " create_bean ")] ( https://cloud.githubusercontent.com/assets/1736354/7929379/cec01bcc-092f-11e5-81ad-88c285f33845.png " create_bean " )
345+ ! [](https: // cloud.githubusercontent.com/assets/1736354/7929379/cec01bcc-092f-11e5-81ad-88c285f33845.png)
346346
347347注入bean的属性
348348注入bean的属性过程函数调用栈如下所示:
349- [ ![ ] ( https://cloud.githubusercontent.com/assets/1736354/7929381/db58350e-092f-11e5-82a4-caaf349291ea.png " inject_property ")] ( https://cloud.githubusercontent.com/assets/1736354/7929381/db58350e-092f-11e5-82a4-caaf349291ea.png " inject_property " )
349+ ! [](https: // cloud.githubusercontent.com/assets/1736354/7929381/db58350e-092f-11e5-82a4-caaf349291ea.png)
350350
351351在创建bean和注入bean的属性时,都是在doCreateBean函数中进行的,我们重点看下:
352352
353- ```
353+ ```java
354354protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd,
355355 final Object [] args) {
356356 // Instantiate the bean.
0 commit comments