天天看點

06、Spring Bean的生命周期:初始化與銷毀

作者:Java面試技術棧

Spring Bean的生命周期:初始化與銷毀

在Spring架構中,Bean的生命周期指的是從建立到初始化,最後到銷毀的整個過程。Spring幫助我們管理Bean的生命周期,并允許我們自定義Bean的初始化和銷毀方法。本文将探讨這些生命周期階段以及如何通過不同的方式定制它們。

1. 指定初始化和銷毀方法

在XML配置檔案中,我們可以使用init-method和destroy-method屬性指定Bean的初始化和銷毀方法。這些方法必須無參數,但可以抛出任何異常。

<bean id="person" scope="singleton" init-method="init" destroy-method="destroy"/>
           

在注解配置方式中,我們可以在@Bean注解中指定初始化和銷毀方法。如下所示:

@Configuration
public class MainConfig3 {
    @Bean(initMethod = "myInit",destroyMethod = "myDestroy")
    public Person person(){
        return new Person();
    }
}
           

當Spring容器建立和初始化Person Bean時,會首先調用Person對象的myInit方法進行初始化,然後在Spring容器關閉時調用myDestroy方法進行銷毀。

注意:Spring容器在關閉時隻會銷毀單例的Bean。對于原型的Bean,即使指定了銷毀方法,Spring容器也不會執行它。

2. 使用InitializingBean和DisposableBean接口

Spring還為我們提供了InitializingBean和DisposableBean接口,我們可以實作這兩個接口來自定義Bean的初始化和銷毀過程。

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Person implements InitializingBean, DisposableBean {
    public String name;
    public Integer age;

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("---執行InitializingBean#afterPropertiesSet---");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("---執行DisposableBean#destroy---");
    }
}
           

在此示例中,afterPropertiesSet方法和destroy方法分别在Bean的初始化和銷毀階段被調用。

3. 使用@PostConstruct和@PreDestroy注解

Spring還支援JSR-250規範定義的@PostConstruct和@PreDestroy注解,這使得我們可以在Bean的生命周期的相應階段執行特定的方法。

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Person {
    public String name;
    public Integer age;

    @PostConstruct
    public void init(){
        System.out.println("---執行@PostConstruct---");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("---執行@PreDestroy---");
    }
}
           

在此示例中,init方法和destroy方法分别在Bean的初始化和銷毀階段被調用。

4. 使用BeanPostProcessor接口

BeanPostProcessor是Spring提供的一個

擴充點,我們可以通過實作這個接口來在Bean的初始化階段執行一些自定義的操作。

public class Bpp implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName){
        System.out.println("---執行postProcessBeforeInitialization---");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName){
        System.out.println("---執行postProcessAfterInitialization---");
        return bean;
    }
}
           

postProcessBeforeInitialization方法在Bean的初始化方法之前被調用,而postProcessAfterInitialization方法在初始化方法之後被調用。

我們可以在Spring配置類中通過@Bean注解将Bpp注冊到Spring容器中:

@Configuration
public class MainConfig3 {
    @Bean
    public Bpp bpp() {
        return new Bpp();
    }

    @Bean(initMethod = "myInit", destroyMethod = "myDestroy")
    public Person person() {
        return new Person();
    }
}
           

當我們啟動Spring應用,我們可以看到以下的輸出結果:

---屬性填充完---
---執行postProcessBeforeInitialization---
---執行InitializingBean#afterPropertiesSet---
---@bean定義的初始化方法---
---執行postProcessAfterInitialization---
---執行@PreDestroy---
---執行DisposableBean#destroy---
---@bean定義的銷毀方法---
           

這說明postProcessBeforeInitialization方法在Bean的初始化方法之前被調用,而postProcessAfterInitialization方法在初始化方法之後被調用。

5. 總結

在Spring架構中,我們可以通過多種方式來定制Bean的生命周期:

  • 通過init-method和destroy-method屬性指定初始化和銷毀方法。
  • 實作InitializingBean和DisposableBean接口來自定義初始化和銷毀過程。
  • 使用@PostConstruct和@PreDestroy注解在Bean的生命周期的相應階段執行特定的方法。
  • 實作BeanPostProcessor接口在Bean的初始化階段執行一些自定義的操作。
06、Spring Bean的生命周期:初始化與銷毀