bean的生命週期: bean創建--初始化--銷燬的過程
構造(對象創建)
* 單實例:在每次容器啓動的時候創建對象
* 多實例:在每次獲取的時候創建對象
初始化:
對象創建完成,並賦值好,調用初始化方法
銷燬:
單實例:容器關閉的時候
多實例:容器不會管理這個bean的銷燬方法
springboot bean的生命週期的意義:可以自定義初始化和銷燬方法,容器在bean進行到當前聲明週期的時候來調用我們自定義的初始化和銷燬方法
一、指定初始化和銷燬方法 在@Bean註解裏指定init方法和destroy方法
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中中指定初始和銷燬方法
//告訴Spring這是一個配置類
@Configuration
public class MainConfig {
/*
* 1、指定初始化和銷燬方法
* 通過@Bean指定initMethod和destroyMethod
*/
@Bean(name="dog",initMethod="init",destroyMethod="destroy")
public Dog dog() {
return new Dog();
}
}
3、創建測試方法進行測試
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
// Dog dog = (Dog)applicationContext.getBean("dog");
}
}
得到結果:
Dog的構造方法執行了
Dog的初始化方法執行了
Dog的銷燬方法執行了
二、通過讓bean實現InitializingBean(定義初始化邏輯),DisposableBean(定義銷燬邏輯)接口
1、創建一個Dog類
public class Dog implements InitializingBean, DisposableBean{
public Dog() {
System.out.println("Dog的構造方法執行了");
}
@Override
public void destroy() {
System.out.println("Dog的銷燬方法執行了");
}
@Override
public void afterPropertiesSet(){
System.out.println("Dog的初始化方法執行了");
}
}
2、定義配置類
//告訴Spring這是一個配置類
@Configuration
public class MainConfig {
/*
* 1、指定初始化和銷燬方法
* 通過@Bean指定initMethod和destroyMethod
*/
@Bean(name="dog")
public Dog dog() {
return new Dog();
}
}
3、測試
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
// Dog dog = (Dog)applicationContext.getBean("dog");
}
}
得到結果:
Dog的構造方法執行了
Dog的初始化方法執行了
Dog的銷燬方法執行了
三、可以使用JSR250註解
@PostConstructor:在bean創建完成並且屬性賦值完成,來執行初始化方法
@PreDestroy:在容器銷燬bean之前通知我們進行清理工作
1、修改dog類
package com.example.demo;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class Dog {
public Dog() {
System.out.println("Dog的構造方法執行了");
}
//對象創建並賦值之後調用
@PostConstruct
public void afterConstruct() {
System.out.println("Dog的初始化方法執行了");
}
//容器移除對象之前
@PreDestroy
public void beforeDestroy() {
System.out.println("Dog的銷燬方法執行了");
}
}
2、定義配置類
//告訴Spring這是一個配置類
@Configuration
public class MainConfig {
/*
* 1、指定初始化和銷燬方法
* 通過@Bean指定initMethod和destroyMethod
*/
@Bean(name="dog")
public Dog dog() {
return new Dog();
}
}
3、測試
SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
// Dog dog = (Dog)applicationContext.getBean("dog");
}
}
得到結果:
Dog的構造方法執行了
Dog的初始化方法執行了
Dog的銷燬方法執行了
四、BeanPostProcessor【接口】:bean的後置處理器,
在bean初始化(init)前後進行處理工作
- postProcessBeforeInitialization 在初始化之前進行一些工作
- 對象初始化
- postProcessAfterInitialization 在初始化之後進行一些工作
1、創建後置處理器
package com.example.demo;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
/*
* 後置處理器,初始化前後進行處理
*/
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
/*
* 參數1爲容器剛創建的bean,beanName爲bean的名字
*/
//初始化前所需要做的處理
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);
//返回的對象可以是原來初始化的bean,也可以是包裝之後的bean
return bean;
}
//初始化後所需要做的處理
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean);
return bean;
}
}
2、創建dog類
public class Dog {
public Dog() {
System.out.println("Dog的構造方法執行了");
}
}
3、創建配置類
//告訴Spring這是一個配置類
@Configuration
public class MainConfig {
/*
* 1、指定初始化和銷燬方法
* 通過@Bean指定initMethod和destroyMethod
*/
@Bean(name="dog")
public Dog dog() {
return new Dog();
}
}
4、測試
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
// Dog dog = (Dog)applicationContext.getBean("dog");
}
}
Dog的構造方法執行了
postProcessBeforeInitialization...dog=>com.example.demo.Dog@6d304f9d
postProcessAfterInitialization...dog=>com.example.demo.Dog@6d304f9d