springboot bean的生命週期

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章