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
          主站蜘蛛池模板: 库尔勒市| 龙井市| 靖宇县| 临高县| 石林| 乌兰县| 图们市| 上杭县| 丰镇市| 启东市| 扶沟县| 大冶市| 贵州省| 鄢陵县| 普格县| 马尔康县| 儋州市| 安徽省| 合山市| 色达县| 清徐县| 紫金县| 南召县| 小金县| 镇远县| 马边| 长寿区| 宁德市| 聂拉木县| 库尔勒市| 黄浦区| 游戏| 哈尔滨市| 大竹县| 平泉县| 淅川县| 垦利县| 西峡县| 梁山县| 新沂市| 馆陶县|