欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中操作Bean的生命周期的方法總結(jié)

 更新時間:2023年12月03日 14:17:21   作者:一只愛擼貓的程序猿  
在SpringBoot應(yīng)用中,管理和操作Bean的生命周期是一項關(guān)鍵的任務(wù),這不僅涉及到如何創(chuàng)建和銷毀Bean,還包括如何在應(yīng)用的生命周期中對Bean進(jìn)行精細(xì)控制,本文給大家總結(jié)了SpringBoot中操作Bean的生命周期的方法,需要的朋友可以參考下

引言

在 Spring Boot 應(yīng)用中,管理和操作 Bean 的生命周期是一項關(guān)鍵的任務(wù)。這不僅涉及到如何創(chuàng)建和銷毀 Bean,還包括如何在應(yīng)用的生命周期中對 Bean 進(jìn)行精細(xì)控制。Spring 框架提供了多種機(jī)制來管理 Bean 的生命周期,這些機(jī)制使得開發(fā)者可以根據(jù)具體的業(yè)務(wù)需求和場景來定制 Bean 的行為。從簡單的注解到實(shí)現(xiàn)特定的接口,每種方法都有其適用的場景和優(yōu)勢。

在 Spring Boot 中,操作 Bean 生命周期的方法主要包括以下:

1. InitializingBean 和 DisposableBean 接口:

在某些環(huán)境或特定的約束下,如果您想避免使用 JSR-250

  • InitializingBean 接口提供了一個方法 afterPropertiesSet(),該方法在 Bean 屬性設(shè)置之后調(diào)用。
  • DisposableBean 接口提供了一個方法 destroy(),該方法在 Bean 銷毀之前調(diào)用。
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class MyBean implements InitializingBean, DisposableBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        // 初始化代碼
        System.out.println("Bean is initialized");
    }

    @Override
    public void destroy() throws Exception {
        // 清理代碼
        System.out.println("Bean is destroyed");
    }
}

2. @PostConstruct 和 @PreDestroy 注解:

這兩個是案例1中相對應(yīng)的注解方式

  • @PostConstruct 注解用于在依賴注入完成后執(zhí)行初始化方法。
  • @PreDestroy 注解用于在 Bean 銷毀之前執(zhí)行清理方法。
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class MyBean {

    @PostConstruct
    public void init() {
        // 初始化代碼
        System.out.println("Bean is initialized");
    }

    @PreDestroy
    public void cleanup() {
        // 清理代碼
        System.out.println("Bean is destroyed");
    }
}

3. Bean 定義的 initMethod 和 destroyMethod:

第三種方式的初始化和銷毀方法

  • 在 Bean 定義中,可以通過 initMethod 和 destroyMethod 屬性指定初始化和銷毀方法。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean(initMethod = "init", destroyMethod = "cleanup")
    public MyBean myBean() {
        return new MyBean();
    }

    public static class MyBean {
        public void init() {
            // 初始化代碼
            System.out.println("Bean is initialized");
        }

        public void cleanup() {
            // 清理代碼
            System.out.println("Bean is destroyed");
        }
    }
}

4. 實(shí)現(xiàn) BeanPostProcessor 接口:

  • BeanPostProcessor 接口提供了兩個方法:postProcessBeforeInitializationpostProcessAfterInitialization,分別在 Bean 初始化之前和之后調(diào)用。
  • 這可以用于在 Bean 初始化的不同階段執(zhí)行自定義邏輯。
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        // 在初始化之前執(zhí)行的代碼
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        // 在初始化之后執(zhí)行的代碼
        return bean;
    }
}

5. 實(shí)現(xiàn) SmartLifecycle 接口:

  • SmartLifecycle 是一個擴(kuò)展的接口,用于更復(fù)雜的生命周期管理,特別是在有多個 Bean 依賴關(guān)系的場景中。
  • 它提供了啟動和停止控制,以及對應(yīng)的回調(diào)方法。
import org.springframework.context.SmartLifecycle;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.atomic.AtomicBoolean;

@Component
public class MySmartLifecycleBean implements SmartLifecycle {
    private static final Logger logger = LoggerFactory.getLogger(MySmartLifecycleBean.class);
    private final AtomicBoolean isRunning = new AtomicBoolean(false);

    @Override
    public void start() {
        // 啟動邏輯
        if (isRunning.compareAndSet(false, true)) {
            // 實(shí)際的啟動邏輯
            initializeResources();
            logger.info("Lifecycle bean started");
        }
    }

    @Override
    public void stop() {
        // 停止邏輯
        if (isRunning.compareAndSet(true, false)) {
            // 實(shí)際的停止邏輯
            releaseResources();
            logger.info("Lifecycle bean stopped");
        }
    }

    @Override
    public boolean isRunning() {
        return isRunning.get();
    }

    @Override
    public int getPhase() {
        // 控制啟動和停止的順序
        return 0; // 默認(rèn)階段是 0,可以根據(jù)需要調(diào)整
    }

    private void initializeResources() {
        // 具體的資源初始化邏輯
    }

    private void releaseResources() {
        // 具體的資源釋放邏輯
    }
}

6. 使用 ApplicationListener 或 @EventListener:

  • 這些用于監(jiān)聽?wèi)?yīng)用事件,如上下文刷新、上下文關(guān)閉等,可以在這些事件發(fā)生時執(zhí)行特定邏輯。
  • ApplicationListener 是一個接口,而 @EventListener 是一個注解,兩者都可以用于監(jiān)聽?wèi)?yīng)用事件。
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

@Component
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        // 在應(yīng)用上下文刷新時執(zhí)行的代碼
        System.out.println("Application Context Refreshed");
    }
}

// 或者使用 @EventListener
@Component
public class MyEventListener {

    @EventListener
    public void handleContextRefresh(ContextRefreshedEvent event) {
        System.out.println("Handling context refreshed event.");
    }
}

7. 實(shí)現(xiàn) ApplicationContextAware 和 BeanNameAware 接口:

  • 這些接口允許 Bean 在其生命周期內(nèi)訪問 ApplicationContext 和自身的 Bean 名稱。
  • 通過實(shí)現(xiàn)這些接口,Bean 可以獲得對 Spring 容器更深層次的訪問和控制。
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
public class MyAwareBean implements ApplicationContextAware, BeanNameAware {
    private static final Logger logger = LoggerFactory.getLogger(MyAwareBean.class);
    private ApplicationContext applicationContext;
    private String beanName;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
        // 可以在這里執(zhí)行與應(yīng)用上下文相關(guān)的操作
        logger.info("ApplicationContext has been set for Bean: {}", beanName);
    }

    @Override
    public void setBeanName(String name) {
        this.beanName = name;
        // 記錄 Bean 名稱
        logger.info("Bean name set to {}", name);
    }

    // 示例方法,展示如何使用 applicationContext
    public void performSomeAction() {
        try {
            // 示例邏輯,例如檢索其他 Bean 或環(huán)境屬性
            // String someProperty = applicationContext.getEnvironment().getProperty("some.property");
            // ... 執(zhí)行操作
        } catch (Exception e) {
            logger.error("Error during performing some action", e);
        }
    }
}

8. 使用 FactoryBean:

  • FactoryBean 是一種特殊的 Bean,用于生成其他 Bean。
  • 可以通過實(shí)現(xiàn) FactoryBean 接口來控制 Bean 的實(shí)例化過程。
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

@Component
public class MyFactoryBean implements FactoryBean<MyCustomBean> {

    @Override
    public MyCustomBean getObject() throws Exception {
        return new MyCustomBean();
    }

    @Override
    public Class<?> getObjectType() {
        return MyCustomBean.class;
    }
}

public class MyCustomBean {
    // 自定義 Bean 的邏輯
}

9. 使用 EnvironmentAware 和 ResourceLoaderAware 接口:

  • 這些接口允許 Bean 在其生命周期內(nèi)訪問 Spring 的 Environment 和資源加載器(ResourceLoader)。
  • 通過實(shí)現(xiàn)這些接口,Bean 可以獲得對環(huán)境屬性和資源的訪問。
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

@Component
public class MyEnvironmentAwareBean implements EnvironmentAware, ResourceLoaderAware {

    private Environment environment;
    private ResourceLoader resourceLoader;

    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }
}

10. 實(shí)現(xiàn) BeanFactoryAware 接口:

  • 通過實(shí)現(xiàn) BeanFactoryAware 接口,Bean 可以訪問到 Spring 容器中的 BeanFactory,從而可以進(jìn)行更復(fù)雜的依賴注入和管理,BeanFactoryAware 應(yīng)該在需要動態(tài)訪問或管理 Bean 時作為特殊用例來使用。
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.stereotype.Component;

@Component
public class MyBeanFactoryAware implements BeanFactoryAware {

    private BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }
}

11. 使用 @Profile 注解:

  • @Profile 注解允許根據(jù)不同的環(huán)境配置(如開發(fā)、測試、生產(chǎn))來激活或禁用特定的 Bean。
  • 這對于控制 Bean 在不同環(huán)境下的創(chuàng)建和管理非常有用。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
public class MyConfiguration {

    @Bean
    @Profile("development")
    public MyBean devMyBean() {
        return new MyBean();
    }

    @Bean
    @Profile("production")
    public MyBean prodMyBean() {
        return new MyBean();
    }

    public static class MyBean {
        // Bean 實(shí)現(xiàn)
    }
}

12. 使用 @Lazy 注解:

  • @Lazy 注解用于延遲 Bean 的初始化直到它被首次使用。
  • 這對于優(yōu)化啟動時間和減少內(nèi)存占用非常有用,特別是對于那些不是立即需要的 Bean。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;

@Configuration
public class MyConfiguration {

    @Bean
    @Lazy
    public MyBean myLazyBean() {
        return new MyBean();
    }

    public static class MyBean {
        // Bean 實(shí)現(xiàn)
    }
}

13. 使用 @DependsOn 注解:

  • @DependsOn 注解用于聲明 Bean 的依賴關(guān)系,確保一個 Bean 在另一個 Bean 之后被初始化。
  • 這在管理 Bean 之間的依賴和初始化順序時非常有用。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;

@Configuration
public class MyConfiguration {

    @Bean
    @DependsOn("anotherBean")
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean
    public AnotherBean anotherBean() {
        return new AnotherBean();
    }

    public static class MyBean {
        // Bean 實(shí)現(xiàn)
    }

    public static class AnotherBean {
        // 另一個 Bean 實(shí)現(xiàn)
    }
}

14. 使用 @Order 或 Ordered 接口:

  • 這些用于定義 Bean 初始化和銷毀的順序。
  • @Order 注解和 Ordered 接口可以幫助確保 Bean 按照特定的順序被創(chuàng)建和銷毀。
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Order(Ordered.HIGHEST_PRECEDENCE)
@Component
public class MyHighPriorityBean {
    // 高優(yōu)先級 Bean 實(shí)現(xiàn)
}

@Component
public class MyDefaultPriorityBean {
    // 默認(rèn)優(yōu)先級 Bean 實(shí)現(xiàn)
}

15. 使用 @Conditional 注解:

  • @Conditional 注解用于基于特定條件創(chuàng)建 Bean。
  • 你可以創(chuàng)建自定義條件或使用 Spring 提供的條件,如操作系統(tǒng)類型、環(huán)境變量、配置屬性等。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

@Configuration
public class MyConfiguration {

    @Bean
    @Conditional(MyCondition.class)
    public MyBean myConditionalBean() {
        return new MyBean();
    }

    public static class MyBean {
        // Bean 實(shí)現(xiàn)
    }

    public static class MyCondition implements Condition {

        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            Environment env = context.getEnvironment();
            // 定義條件邏輯
            return env.containsProperty("my.custom.condition");
        }
    }
}

總結(jié)

Spring Boot 提供的這些方法使得開發(fā)者能夠靈活地控制 Bean 的生命周期,從而滿足不同的應(yīng)用需求和場景。無論是簡單的應(yīng)用還是復(fù)雜的企業(yè)級系統(tǒng),合理地利用這些機(jī)制可以有效地管理 Bean 的生命周期,提高應(yīng)用的性能和可維護(hù)性。選擇哪種方法取決于具體的需求、應(yīng)用的復(fù)雜性以及開發(fā)團(tuán)隊的偏好。正確地使用這些工具和技術(shù)可以使 Spring Boot 應(yīng)用更加健壯、靈活和高效。

以上就是SpringBoot中操作Bean的生命周期的方法總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot操作Bean生命周期的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java單例模式使用詳解

    java單例模式使用詳解

    這篇文章主要介紹了java單例模式使用方法,通常它的實(shí)現(xiàn)方式分為懶漢式實(shí)現(xiàn)和餓漢式,下面是詳細(xì)說明加示例,需要的朋友可以參考下
    2014-04-04
  • JAVA設(shè)計模式零基礎(chǔ)解析之單例模式的八種方式

    JAVA設(shè)計模式零基礎(chǔ)解析之單例模式的八種方式

    設(shè)計模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗(yàn)的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性
    2021-10-10
  • Struts2實(shí)現(xiàn)文件上傳功能

    Struts2實(shí)現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了Struts2實(shí)現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 詳解SpringBoot如何創(chuàng)建自定義Starter

    詳解SpringBoot如何創(chuàng)建自定義Starter

    Spring Boot的自動配置機(jī)制為開發(fā)人員提供了一種輕松集成和配置各種功能的便捷方式,本文將深入探討在Spring Boot中如何創(chuàng)建自定義Starter,為構(gòu)建模塊化且易維護(hù)的應(yīng)用提供有力的支持,需要的朋友可以參考下
    2024-02-02
  • SpringBoot引入swagger報錯處理的解決方法

    SpringBoot引入swagger報錯處理的解決方法

    這篇文章主要給大家介紹SpringBoot引入swagger是會出現(xiàn)報錯的處理解決方法,文中有詳細(xì)的解決過程,感興趣的小伙伴可以跟著小編一起來學(xué)習(xí)吧
    2023-06-06
  • 深入學(xué)習(xí)Spring Boot排查 @Transactional 引起的 NullPointerException問題

    深入學(xué)習(xí)Spring Boot排查 @Transactional 引起的 NullPointerException問題

    這篇文章主要介紹了深入學(xué)習(xí)Spring Boot排查 @Transactional 引起的 NullPointerException問題,需要的朋友可以參考下
    2018-01-01
  • JavaCV實(shí)現(xiàn)獲取視頻每幀并保存

    JavaCV實(shí)現(xiàn)獲取視頻每幀并保存

    這篇文章主要為大家詳細(xì)介紹了JavaCV實(shí)現(xiàn)獲取視頻每幀并保存,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 深度對比與解析SpringBoot中的application.properties與application.yml

    深度對比與解析SpringBoot中的application.properties與application.yml

    在Springboot項目中,使用.properties和.yml配置是等效的,均可以正常識別并使用,本文將為大家深入對比與解析一下二者的使用與區(qū)別,希望對大家有一定的幫助
    2025-04-04
  • 從零開始SSM搭建步驟(圖文)

    從零開始SSM搭建步驟(圖文)

    這篇文章主要介紹了從零開始SSM搭建步驟(圖文),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • idea中提示Class 'xxx' is never used的解決

    idea中提示Class 'xxx' is never us

    這篇文章主要介紹了idea中提示Class 'xxx' is never used的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論