詳解Spring中Bean的作用域與生命週期

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"​​​​​​摘要:在利用Spring進行IOC配置時,關於bean的配置和使用一直都是比較重要的一部分,同時如何合理的使用和創建bean對象,也是小夥伴們在學習和使用Spring時需要注意的部分,所以這一篇文章我就來和大家講一下有關Spring中bean的作用域和其生命週期。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文分享自華爲雲社區","attrs":{}},{"type":"link","attrs":{"href":"https://bbs.huaweicloud.com/blogs/284558?utm_source=infoq&utm_medium=bbs-ex&utm_campaign=other&utm_content=content","title":"","type":null},"content":[{"type":"text","text":"《詳解Spring中Bean的作用域與生命週期》","attrs":{}}]},{"type":"text","text":",原文作者:灰小猿。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在利用Spring進行IOC配置時,關於bean的配置和使用一直都是比較重要的一部分,同時如何合理的使用和創建bean對象,也是小夥伴們在學習和使用Spring時需要注意的部分,所以這一篇文章我就來和大家講一下有關Spring中bean的作用域和其生命週期。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"一、Bean的作用域","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先我們來講一下有關於bean的作用域","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"一般情況下,我們書寫在IOC容器中的配置信息,會在我們的IOC容器運行時被創建,","attrs":{}},{"type":"text","text":"這就導致我們通過IOC容器獲取到bean對象的時候,往往都是獲取到了單實例的Bean對象","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這樣就意味着無論我們使用多少個getBean()方法,獲取到的同一個JavaBean都是同一個對象,這就是單實例Bean,整個項目都會共享這一個bean對象。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"在Spring中,可以在元素的scope屬性裏設置bean的作用域,以決定這個bean是單實例的還是多實例的。","attrs":{}},{"type":"text","text":"Scope屬性有四個參數,具體的使用可以看下圖:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/09/097b69c4bd49c5b8fd89ccd2c93e1670.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"1、單實例Bean聲明","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"默認情況下,Spring只爲每個在IOC容器裏聲明的bean創建唯一一個實例,整個IOC容器範圍內都能共享該實例:所有後續的getBean()調用和bean引用都將返回這個唯一的bean實例。該作用域被稱爲singleton,","attrs":{}},{"type":"text","text":"它是所有bean的默認作用域。也就是單實例。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了驗證這一說法,我們在IOC中創建一個單實例的bean,並且獲取該bean對象進行對比:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"測試獲取到的單實例bean是否是同一個:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"@Test\npublic void test09() {\n // 單實例創建時創建的兩個bean相等\n Book book03 = (Book)iocContext3.getBean(\"book02\");\n Book book04 = (Book)iocContext3.getBean(\"book02\");\n System.out.println(book03==book04);\n}","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"得到的結果是true","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"2、多實例Bean聲明","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而既然存在單實例,那麼就一定存在多實例。我們可以爲bean對象的scope屬性設置prototype參數,以表示該實例是多實例的,同時獲取IOC容器中的多實例bean,再將獲取到的多實例bean進行對比","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"測試獲取到的多實例bean是否是同一個:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"@Test\npublic void test09() {\n // 多實例創建時,創建的兩個bean對象不相等\n Book book01 = (Book)iocContext3.getBean(\"book01\");\n Book book02 = (Book)iocContext3.getBean(\"book01\");\n System.out.println(book01==book02);\n}","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"得到的結果是false","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這就說明了,通過多實例創建的bean對象是各不相同的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"在這裏需要注意:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"同時關於單實例和多實例bean的創建也有不同,當bean的作用域爲單例時,Spring會在IOC容器對象創建時就創建bean的對象實例。而當bean的作用域爲prototype時,IOC容器在獲取bean的實例時創建bean的實例對象。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"二、Bean的生命週期","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"1、bean的初始和銷燬","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其實我們在IOC中創建的每一個bean對象都是有其特定的生命週期的,在Spring的IOC容器中可以管理bean的生命週期,Spring允許在bean生命週期內特定的時間點執行指定的任務。如在bean初始化時執行的方法和bean被銷燬時執行的方法。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Spring IOC容器對bean的生命週期進行管理的過程可以分爲六步:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1.   通過構造器或工廠方法創建bean實例","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2.   爲bean的屬性設置值和對其他bean的引用","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3.   調用bean的初始化方法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"4.   bean可以正常使用","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"5.   當容器關閉時,調用bean的銷燬方法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那麼關於bean的初始和銷燬時執行的方法又該如何聲明呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先我們應該在bean類內部添加初始和銷燬時執行的方法。如下面這個javabean:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"package com.spring.beans;\n\npublic class Book {\n\tprivate String bookName;\n\tprivate String author;\n\t/**\n\t * 初始化方法\n\t * */\n\tpublic void myInit() {\n\t\tSystem.out.println(\"book bean被創建\");\n\t}\n\t\n\t/**\n\t * 銷燬時方法\n\t * */\n\tpublic void myDestory() {\n\t\tSystem.out.println(\"book bean被銷燬\");\n\t}\n\t\n\tpublic String getBookName() {\n\t\treturn bookName;\n\t}\n\tpublic void setBookName(String bookName) {\n\t\tthis.bookName = bookName;\n\t}\n\tpublic String getAuthor() {\n\t\treturn author;\n\t}\n\tpublic void setAuthor(String author) {\n\t\tthis.author = author;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Book [bookName=\" + bookName + \", author=\" + author + \"]\";\n\t}\n}","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這時我們在配置bean時,可以通過init-method和destroy-method 屬性爲bean指定初始化和銷燬方法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這樣當我們在通過IOC容器創建和銷燬bean對象時就會執行相應的方法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"但是這裏還是有一點需要注意:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們上面說了,單實例的bean和多實例的bean的創建時間是不同的,那麼他們的初始方法和銷燬方法的執行時間就稍稍有不同。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"單實例下 bean的生命週期","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"容器啓動——>初始化方法——>(容器關閉)銷燬方法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"多實例下 bean的生命週期","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"容器啓動——>調用bean——>初始化方法——>容器關閉(銷燬方法不執行)","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"2、bean的後置處理器","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"什麼是bean的後置處理器?bean後置處理器允許在調用","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"初始化方法前後","attrs":{}},{"type":"text","text":"對bean進行額外的處理","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"bean後置處理器對IOC容器裏的所有bean實例逐一處理,而非單一實例。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其典型應用是:檢查bean屬性的正確性或根據特定的標準更改bean的屬性。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"bean後置處理器使用時需要實現接口:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"org.springframework.beans.factory.config.BeanPostProcessor。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在初始化方法被調用前後,Spring將把每個bean實例分別傳遞給上述接口的以下兩個方法:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"postProcessBeforeInitialization(Object, String)調用前","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"postProcessAfterInitialization(Object, String)調用後","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如下是一個實現在該接口的後置處理器:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"package com.spring.beans;\n\nimport org.springframework.beans.BeansException;\nimport org.springframework.beans.factory.config.BeanPostProcessor;\n\n/**\n * 測試bean的後置處理器\n * 在這裏要注意一點是爲了出現bean和beanName,而不是arg0、arg1,需要綁定相應的源碼jar包\n * */\npublic class MyBeanPostProcessor implements BeanPostProcessor{\n\n\t/**\n\t * postProcessBeforeInitialization\n\t * 初始化方法執行前執行\n\t * Object bean\n\t * String beanName xml容器中定義的bean名稱\n\t * */\n\t@Override\n\tpublic Object postProcessBeforeInitialization(Object bean, String beanName)\n\t\t\tthrows BeansException {\n\t\t// TODO Auto-generated method stub\n\t\tSystem.out.println(\"【\"+ beanName+\"】初始化方法執行前...\");\n\t\treturn bean;\n\t}\n\n\t/**\n\t * postProcessAfterInitialization\n\t * 初始化方法執行後執行\n\t * Object bean\n\t * String beanName xml容器中定義的bean名稱\n\t * */\n\t@Override\n\tpublic Object postProcessAfterInitialization(Object bean, String beanName)\n\t\t\tthrows BeansException {\n\t\t// TODO Auto-generated method stub\n\t\tSystem.out.println(\"【\"+ beanName+\"】初始化方法執行後...\");\n\t\treturn bean;\n\t}\n\n}","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"將該後置處理器加入到IOC容器中:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"由於現在我們的bean對象是單實例的,所以容器運行時就會直接創建bean對象,同時也會執行該bean的後置處理器方法和初始化方法,在容器被銷燬時又會執行銷燬方法","attrs":{}},{"type":"text","text":"。我們測試如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"//*************************bean生命週期*****************\n//\t由於ApplicationContext是一個頂層接口,裏面沒有銷燬方法close,所以需要使用它的子接口進行接收\n\tConfigurableApplicationContext iocContext01 = new ClassPathXmlApplicationContext(\"ioc1.xml\");\n\t\n\t@Test\n\tpublic void test01() {\n\t\tiocContext01.getBean(\"book01\");\n\t\tiocContext01.close();\n\t}","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"運行結果:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/79/79c843836012012f54ee791dd56f880e.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/66/66bee5e3dd76751ffd900bfc32ab8946.jpeg","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"總結一下後置處理器的執行過程:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1.    通過構造器或工廠方法","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"創建bean實例","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2.    爲bean的","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"屬性設置值","attrs":{}},{"type":"text","text":"和對其他bean的引用","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3.    將bean實例傳遞給bean後置處理器的","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"postProcessBeforeInitialization()","attrs":{}},{"type":"text","text":"方法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"4.    調用bean的","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"初始化","attrs":{}},{"type":"text","text":"方法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"5.    將bean實例傳遞給bean後置處理器的","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"postProcessAfterInitialization()","attrs":{}},{"type":"text","text":"方法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"6.    bean可以使用了","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"7.    當容器關閉時調用bean的銷燬方法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"所以添加bean後置處理器後bean的生命週期爲:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"容器啓動——後置處理器的before...——>初始化方法——>後置處理器的after...———>(容器關閉)銷燬方法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://bbs.huaweicloud.com/blogs?utm_source=infoq&utm_medium=bbs-ex&utm_campaign=other&utm_content=content","title":"","type":null},"content":[{"type":"text","text":"點擊關注,第一時間瞭解華爲雲新鮮技術~","attrs":{}}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章