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=>[email protected]
postProcessAfterInitialization...dog=>[email protected]