Atea - Hero's Grave

          面向對象,開源,框架,敏捷,云計算,NoSQL,商業智能,編程思想。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            40 隨筆 :: 0 文章 :: 28 評論 :: 0 Trackbacks
          Spring可以給定義的bean/beans設置init-method和destroy-method。

          helloworld.xml
          <!--default scope is singleton-->
          <bean id="bean1" class="my.Bean1"
            init-method
          ="init" destroy-method="destroy">
          </bean>
          <bean id="bean2" class="my.Bean2"
            init-method
          ="init" destroy-method="destroy">
          </bean>

          Bean1.
          java
          public class Bean1 {
              
          public Bean1() {
                System.out.println(
          "constructor Bean1");
              }    
              
          public void init(){
                  System.out.println(
          "init Bean1");
              }    
              
          public void destroy(){
                  System.out.println(
          "destroy Bean1");
              }      
          }

          Bean2.
          java
          public class Bean2 {
              
          public Bean1() {
                System.out.println(
          "constructor Bean2");
              }    
              
          public void init(){
                  System.out.println(
          "init Bean2");
              }    
              
          public void destroy(){
                  System.out.println(
          "destroy Bean2");
              }      


          test.java
          AbstractApplicationContext factory = new ClassPathXmlApplicationContext("helloworld.xml"); 
          //如果是非web app環境,需要設置手動關閉IoC容器(shutdown hook)后才能執行destroy-method。
          factory.registerShutdownHook();        
          System.out.println(
          "begin!");
          Bean1 b1 
          = (Bean1) factory.getBean("bean1");
          Bean2 b2 
          = (Bean2) factory.getBean("bean2");
          System.out.println(
          "end!");

          輸出:
          constructor Bean1
          init Bean1
          constructor Bean2
          init Bean2
          begin!
          end!
          destroy Bean2
          destroy Bean1
          可以看出如果bean的scope是singleton,只會在Ico容器創建的時候被創建1次。
          PS: bean初始化順序和銷毀順序相反。

          那么如果改變scope的話:
          <bean id="bean1" class="my.Bean1" scope="prototype"
            init-method
          ="init" destroy-method="destroy">
          </bean>
          <bean id="bean2" class="my.Bean2"
            init-method
          ="init" destroy-method="destroy">
          </bean>

          輸出:
          constructor Bean2
          init Bean2
          begin!
          constructor Bean1
          init Bean1
          end!
          destroy Bean2

          當IoC容器創建時,prototype的bean不再被創建了。
          之后對于每次bean的請求都會創建新的對象,但任何時候都不會執行destroy-method!

          注意:
          1. 如果bean被aop監聽的話(aop:pointcut),bean的init-method是不會執行的(構造函數會執行)。
          2. 如果bean是其他bean的field(ref bean),init-method和構造函數都會執行。
          posted on 2008-09-19 15:48 Atea 閱讀(573) 評論(0)  編輯  收藏 所屬分類: Spring
          主站蜘蛛池模板: 竹北市| 驻马店市| 略阳县| 安宁市| 肇庆市| 常熟市| 宁波市| 铜陵市| 阳曲县| 塘沽区| 黄平县| 阿坝县| 安福县| 汾西县| 井研县| 临清市| 黄陵县| 大连市| 惠州市| 英吉沙县| 介休市| 巴青县| 沁源县| 抚州市| 琼结县| 定结县| 阿巴嘎旗| 汝南县| 会理县| 兴仁县| 兴义市| 华坪县| 岳阳县| 阿瓦提县| 阿克苏市| 通海县| 陆丰市| 颍上县| 手游| 贞丰县| 抚松县|