Spring註解驅動開發-生命週期01-指定初始化和銷燬方法[@Bean指定init-method和destroy-method]
阿新 • • 發佈:2021-02-03
/**
* bean的生命週期:
* bean建立---初始化----銷燬的過程
* 容器管理bean的生命週期;
* 我們可以自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法
*
* 構造(物件建立)
* 單例項:在容器啟動的時候建立物件
* 多例項:在每次獲取的時候建立物件\
*
* BeanPostProcessor.postProcessBeforeInitialization
* 初始化:
* 物件建立完成,並賦值好,呼叫初始化方法。。。
* BeanPostProcessor.postProcessAfterInitialization* 銷燬:
* 單例項:容器關閉的時候
* 多例項:容器不會管理這個bean;容器不會呼叫銷燬方法;
*
*
* 遍歷得到容器中所有的BeanPostProcessor;挨個執行beforeInitialization,
* 一但返回null,跳出for迴圈,不會執行後面的BeanPostProcessor.postProcessorsBeforeInitialization
*
* BeanPostProcessor原理
* populateBean(beanName, mbd, instanceWrapper);給bean進行屬性賦值
* initializeBean
* {
* applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);* invokeInitMethods(beanName, wrappedBean, mbd);執行自定義初始化
* applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
*}
*
* 1)、指定初始化和銷燬方法;
* 通過@Bean指定init-method和destroy-method;
* 2)、通過讓Bean實現InitializingBean(定義初始化邏輯),
* DisposableBean(定義銷燬邏輯);
* 3)、可以使用JSR250;
* @PostConstruct:在bean建立完成並且屬性賦值完成;來執行初始化方法* @PreDestroy:在容器銷燬bean之前通知我們進行清理工作
* 4)、BeanPostProcessor【interface】:bean的後置處理器;
* 在bean初始化前後進行一些處理工作;
* postProcessBeforeInitialization:在初始化之前工作
* postProcessAfterInitialization:在初始化之後工作
*
* Spring底層對 BeanPostProcessor 的使用;
* ①、bean賦值②、注入其他元件③、@Autowired④、生命週期註解功能⑤、@Async,@xxx 都是通過BeanPostProcessor來完成的;
*/
bean的生命週期:
物件建立---初始化----銷燬的過程
容器管理bean的生命週期:
我們可以自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法
例項化:
單例項:在容器啟動的時候建立物件
多例項:在每次獲取的時候建立物件
初始化:
物件建立完成,並賦值好,呼叫初始化方法
銷燬:
單例項:容器關閉的時候
多例項:容器不會管理這個bean;容器不會呼叫銷燬方法;指定初始化和銷燬方法:通過@Bean指定init-method和destroy-method
目錄
1、配置類
package com.atguigu.config; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; import com.atguigu.bean.Car; /** * bean的生命週期: * bean建立---初始化----銷燬的過程 * 容器管理bean的生命週期; * 我們可以自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法 * 例項化 * 單例項:在容器啟動的時候建立物件 * 多例項:在每次獲取的時候建立物件 * 初始化: * 物件建立完成,並賦值好,呼叫初始化方法 * 銷燬: * 單例項:容器關閉的時候 * 多例項:容器不會管理這個bean;容器不會呼叫銷燬方法; * */ @ComponentScan("com.atguigu.bean") @Configuration public class MainConfigOfLifeCycle { //@Scope("prototype") @Bean(initMethod="init",destroyMethod="detory") public Car car(){ return new Car(); } }
2、註冊的Bean
package com.atguigu.bean; import org.springframework.stereotype.Component; @Component public class Car { public Car(){ System.out.println("car...constructor..."); } public void init(){ System.out.println("car...init..."); } public void destory(){ System.out.println("car...destory..."); } }
3、測試類
package com.atguigu.test; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.atguigu.config.MainConfigOfLifeCycle; public class IOCTest_LifeCycle { @Test public void test01(){ //1、建立ioc容器 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class); System.out.println("容器建立完成..."); //applicationContext.getBean("car"); //關閉容器 applicationContext.close(); } }