天天看點

springboot 元件的生命周期

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]
           

繼續閱讀