構造(對象創建)
* 單實例:在每次容器啟動的時候創建對象
* 多實例:在每次獲取的時候創建對象
初始化:
對象創建完成,並賦值好,調用初始化方法
銷毀:
單實例:容器關閉的時候
多實例:容器不會不會管理這個bean的銷毀方法
1、創建一個Dog類
public class Dog { public Dog() { System.out.println("Dog的構造方法執行了"); } public void init() { System.out.println("Dog的初始化方法執行了"); } public void destroy() { System.out.println("Dog的銷毀方法執行了"); } }
2、在注入Dog時在@Bean中中指定初始和銷毀方法
/** * 測試bean的生命周期的配置 */ @Configuration public class MainConfigOfLifeCycle { /* * 1、指定初始化和銷毀方法 * 通過@Bean指定initMethod和destroyMethod */ @Bean(name="dog",initMethod="init",destroyMethod="destroy") public Dog dog() { return new Dog(); } }
3、創建測試方法進行測試
/* * 測試@Bean中指定initMethod和destroyMethod */ @Test public void test01() { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class); applicationContext.close(); }
得到結果:
說明: 因為注入的Dog是單例模式,所以在容器創建時就注入,另外調用了初始化方法,容器關閉前執行了銷毀方法
現在進行如果Dog是多例模式時測試
1、修改配置類將Dog設置為多例
/** * 測試bean的生命周期的配置 */ @Configuration public class MainConfigOfLifeCycle { /* * 1、指定初始化和銷毀方法 * 通過@Bean指定initMethod和destroyMethod */ @Bean(name="dog",initMethod="init",destroyMethod="destroy") @Scope("prototype") public Dog dog() { return new Dog(); } }
2、修改測試方法
/* * 測試@Bean中指定initMethod和destroyMethod */ @Test public void test01() { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class); Object bean = applicationContext.getBean("dog"); applicationContext.close(); }
測試結果
說明:多例對象只有在獲取的時候容器才給構造並調用初始化方法,另外容器不會調用多例對象的銷毀方法