首頁 >Java >java教程 >春季:整個spring-bean-lifecycle-from-from-from-from-for-totuction to-samplem-tamples

春季:整個spring-bean-lifecycle-from-from-from-from-for-totuction to-samplem-tamples

DDD
DDD原創
2025-01-29 20:14:10983瀏覽

spring-: entire-spring-bean-lifecycle-from-registration-to-destruction-with-sample-examples

>本指南提供了彈簧豆生命週期的全面演練,以實踐的例子展示了每個階段。 我們將順序探索春季的生命週期方法,對春季如何管理其從註冊到破壞的豆類有深入的了解。

>

步驟1:BEAN定義註冊(registerBeanDefinition()

>

我們首先檢查彈簧寄存器bean定義如何在>實例化之前,利用>。 BeanDefinitionRegistry

發生了什麼:彈簧加載和從各種來源登記bean定義:>,@ComponentScan類中的方法和xml configuration(如果使用)。 至關重要的是,此時沒有實例化的豆類。 春季只是將元數據存儲在每個豆子周圍。 @Bean @Configuration實踐:>使用

密鑰外賣:BeanDefinitionRegistryPostProcessor動態bean註冊(例如,基於條件或外部配置)是通過此方法實現的。 在此階段,豆子本質上是藍圖。 只有在真正必要的動態註冊時,只有很少使用此方法。

>
<code class="language-java">@Configuration
public class CustomBeanRegistrar implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(MyDynamicBean.class);
        registry.registerBeanDefinition("myDynamicBean", beanDefinition);
        System.out.println("Custom bean definition registered: MyDynamicBean");
    }

    // ... (rest of the code remains the same)
}</code>
>步驟2:實例化之前(

接下來,我們探索

postProcessBeforeInstantiation()發生了什麼:此方法在

bean的實例化之前執行

。 它允許在創建之前修改或替換Bean實例InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation(),甚至可以通過返回代理或自定義對象來預防標準實例。

>

實例:截取bean實例來記錄目的。 密鑰觀察:

此方法在調用構造函數之前運行

。 它對於AOP方案(創建代理)很有價值。 > 步驟3:bean名稱意識(

<code class="language-java">@Component
class CustomInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        System.out.println("Before instantiating bean: " + beanName);
        return null; // Allows normal instantiation
    }
}</code>
實例化後,春季呼叫

>發生了什麼: bean在應用程序上下文中意識到了自己的名稱。這發生在

依賴注入之前。

> setBeanName()

實踐示例: bean識別自己的名字。 >

BeanNameAware#setBeanName()

鍵觀察:

此方法立即在發生後立即稱為。 豆可以存儲其名稱以供以後使用(例如,日誌記錄或內部操作)。

>步驟4-12:進一步的生命週期方法

剩餘的生命週期方法(BeanClassLoaderAwareBeanFactoryAwareEnvironmentAwareEmbeddedValueResolverAwareResourceLoaderAwareApplicationEventPublisherAwareMessageSourceAwareApplicationContextAware

>)遵循類似的模式:春季調用特定的模式Setter方法,為BEAN提供了對關鍵的彈簧組件的訪問。 這些內容在原始文檔中詳細介紹,並遵循“發生什麼”,“實際示例”和“關鍵觀察”的相同結構。 他們允許分別訪問ClassLoader,Bean Factory,Environment Properties,嵌入式值解析器,資源加載程序,事件發布者,消息源和應用程序上下文。 postProcessBeforeInitialization()>

>步驟13:在初始化之前(

BeanPostProcessor#postProcessBeforeInitialization() >在@PostConstructInitializingBean#afterPropertiesSet()

初始化回調之前()。

>

發生了什麼:>允許在Bean完全初始化之前修改Bean屬性或方面的應用(代理,驗證,記錄)。

實踐:
<code class="language-java">@Configuration
public class CustomBeanRegistrar implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(MyDynamicBean.class);
        registry.registerBeanDefinition("myDynamicBean", beanDefinition);
        System.out.println("Custom bean definition registered: MyDynamicBean");
    }

    // ... (rest of the code remains the same)
}</code>
在初始化之前修改bean。

>

密鑰觀察:

此方法在初始化回調之前執行。 @PostConstruct afterPropertiesSet()>步驟14:初始化回調(

postProcessBeforeInitialization()

春季在

> 之後調用初始化回調 @PostConstruct>發生了什麼:InitializingBean#afterPropertiesSet()

(基於註釋)和

(基於接口)用於驗證,資源設置或任何依賴後依賴性注入初始化。 實踐:@PostConstruct使用afterPropertiesSet()

>。
<code class="language-java">@Component
class CustomInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        System.out.println("Before instantiating bean: " + beanName);
        return null; // Allows normal instantiation
    }
}</code>

鍵觀察:@PostConstructafterPropertiesSet()>在@PostConstruct之前運行。 除非嚴格必要,否則優惠InitializingBean

>步驟15:初始化(postProcessAfterInitialization()

之後

BeanPostProcessor#postProcessAfterInitialization()執行初始化回調。

>

>發生了什麼:>允許在完整的bean初始化後應用代理或執行最終修改。

實踐示例:應用後啟動後修改。

<code class="language-java">class MyDynamicBean implements BeanNameAware {
    private String beanName;

    // ... (constructor and other methods)

    @Override
    public void setBeanName(String name) {
        this.beanName = name;
        System.out.println("Bean name set: " + name);
    }
}</code>

> 密鑰觀察:此方法在初始化回調後調用。

>步驟16:破壞回調(@PreDestroydestroy()

>最後,在應用程序關閉之前調用破壞回調。

>

>>發生了什麼:@PreDestroy(基於註釋)和DisposableBean#destroy()(基於接口)確保正確的資源清理。

實踐:清理資源。

<code class="language-java">@Configuration
public class CustomBeanRegistrar implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(MyDynamicBean.class);
        registry.registerBeanDefinition("myDynamicBean", beanDefinition);
        System.out.println("Custom bean definition registered: MyDynamicBean");
    }

    // ... (rest of the code remains the same)
}</code>

鍵觀察:>在@PreDestroy之前運行。 除非需要destroy()>的功能。 @PreDestroy這個全面的概述詳細介紹了彈簧豆生命週期,使開發人員能夠有效利用Spring的生命週期管理功能來實現穩健且管理良好的應用。

以上是春季:整個spring-bean-lifecycle-from-from-from-from-for-totuction to-samplem-tamples的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn