1. 程式人生 > >spring裝配Bean過程以及Bean例項化過程

spring裝配Bean過程以及Bean例項化過程

<ol class="linenums" style="margin:0px; word-wrap:break-word; padding:0px 0px 0px 40px"><li class="L0" style="word-wrap:break-word; padding-left:0px; color:rgb(190,190,197)"><code style="font-family:Monaco,Menlo,Consolas,'Courier New',monospace; padding:0px; color:inherit; word-wrap:break-word; background-color:transparent"><span style="font-size:18px"><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">-</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">applicationContext</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">.</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">xml</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">(</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">parent</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">)</span></span></code></li><li class="L1" style="word-wrap:break-word; padding-left:0px; color:rgb(190,190,197)"><code style="font-family:Monaco,Menlo,Consolas,'Courier New',monospace; padding:0px; color:inherit; word-wrap:break-word; background-color:transparent"><span style="font-size:18px"><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">         </span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">-</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">aContext</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">.</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">xml</span></span></code></li><li class="L2" style="word-wrap:break-word; padding-left:0px; color:rgb(190,190,197)"><code style="font-family:Monaco,Menlo,Consolas,'Courier New',monospace; padding:0px; color:inherit; word-wrap:break-word; background-color:transparent"><span style="font-size:18px"><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">             </span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">-</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">bContext</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">.</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">xml</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">(初始化)</span></span></code></li><li class="L3" style="word-wrap:break-word; padding-left:0px; color:rgb(190,190,197)"><code style="font-family:Monaco,Menlo,Consolas,'Courier New',monospace; padding:0px; color:inherit; word-wrap:break-word; background-color:transparent"><span style="font-size:18px"><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">             </span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">-</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">cContext</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">.</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">xml</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">(初始化)</span></span></code></li><li class="L4" style="word-wrap:break-word; padding-left:0px; color:rgb(190,190,197)"><code style="font-family:Monaco,Menlo,Consolas,'Courier New',monospace; padding:0px; color:inherit; word-wrap:break-word; background-color:transparent"><span style="font-size:18px"><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">         </span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">-</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">bContext</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">.</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">xml</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">(初始化,覆蓋原來的</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">bean</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">)</span></span></code></li><li class="L5" style="word-wrap:break-word; padding-left:0px; color:rgb(190,190,197)"><code style="font-family:Monaco,Menlo,Consolas,'Courier New',monospace; padding:0px; color:inherit; word-wrap:break-word; background-color:transparent"><span style="font-size:18px"><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">         </span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">-</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">cContext</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">.</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">xml</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">(初始化,覆蓋原來的</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">bean</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">)</span></span></code></li></ol>

Spring原始碼閱讀筆記

註冊bean的定義程式碼:

<ol class="linenums" style="margin:0px; word-wrap:break-word; padding:0px 0px 0px 40px"><li class="L0" style="word-wrap:break-word; padding-left:0px; color:rgb(190,190,197)"><code style="font-family:Monaco,Menlo,Consolas,'Courier New',monospace; padding:0px; color:inherit; word-wrap:break-word; background-color:transparent"><span style="font-size:18px"><span class="typ" style="word-wrap:break-word; color:rgb(0,128,128)">AbstractBeanDefinitionReader</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">.</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">loadBeanDefinitions </span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">-->..</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)"> </span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">--></span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)"> </span><span class="typ" style="word-wrap:break-word; color:rgb(0,128,128)">DefaultListableBeanFactory</span><span class="pun" style="word-wrap:break-word; color:rgb(147,161,161)">.</span><span class="pln" style="word-wrap:break-word; color:rgb(72,72,76)">registerBeanDefinition</span></span></code></li></ol>
  • 如果重複的bean name定義在同一個檔案中,那麼編譯錯誤
  • 如果重複的bean name定義在不同的檔案中,型別可以不一樣,那麼後加載的那個bean會將先載入的bean覆蓋掉。(型別不一樣時,可能導致其他類的引用出錯)——weibo rpc的配置中,如果兩個檔案引用同一個refer,那麼會報錯nested exception is java.lang.IllegalStateException: Duplicate spring bean id
  • 如果多次import同一個檔案,那麼相當於在不同的檔案中定義了相同的bean。
  • 如果allowBeanDefinitionOverriding被設定為false
    ,那麼不能有相同名字的bean。
  • 使用BeanPostProcessor列印bean的載入時間,順序可能跟bean的初始化順序不一致。
  • AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("/beans.xml"); //隨著spring容器載入,就不會例項化bean。

    Person person = ctx.getBean("person");//這一步才在例項化bean。就是前面說的需要的時候再例項化了。

    下面就是例項化bean的過程。

    例項化bean測試結果:先建構函式——>然後是b的set方法注入—— >InitializingBean 的afterPropertiesSet方法——>init- method方法

    教科書上總結為:
    一、Spring裝配Bean的過程

    1. 例項化;
    2. 設定屬性值;
    3. 如果實現了BeanNameAware介面,呼叫setBeanName設定Bean的ID或者Name;
    4. 如果實現BeanFactoryAware介面,呼叫setBeanFactory 設定BeanFactory;
    5.如果實現ApplicationContextAware,呼叫setApplicationContext設定ApplicationContext
    6. 呼叫BeanPostProcessor的預先初始化方法;
    7. 呼叫InitializingBean的afterPropertiesSet()方法;
    8. 呼叫定製init-method方法;
    9. 呼叫BeanPostProcessor的後初始化方法;


    Spring容器關閉過程
    1. 呼叫DisposableBean的destroy();
    2. 呼叫定製的destroy-method方法;