首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring BeanPostProcessor 實戰:Bean 初始化前後的預處理與後處理

     編輯:Java 相關知識

核心概念

BeanPostProcessor 介面定義兩個回調:

  • postProcessBeforeInitialization:Bean 初始化方法(如 @PostConstruct、init-method)執行前調用。
  • postProcessAfterInitialization:初始化方法執行後調用,可修改或替換 Bean 實例。

實現類註冊到容器後,所有 Bean 都會經過這兩個回調,故需在方法內判斷目標 Bean(按類型或名稱)。

註冊方式差異

容器類型註冊方式
BeanFactory程式化調用 addBeanPostProcessor(processor)
ApplicationContextXML 宣告 <bean class="..."/>,容器自動識別並註冊

多處理器排序

實作 Ordered 介面,設定 order 屬性值越小優先級越高。

完整範例

目標 Bean:Animal

public class Animal {
    private String name;
    private int age;
    public String speak() { return "我的名字是:" + name + ",年齡是:" + age + "!"; }
    // getter/setter 省略
}

處理器:BeanPost

public class BeanPost implements BeanPostProcessor {
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof Animal) {
            Animal a = (Animal) bean;
            a.setAge(50);
            a.setName("猴子");
            return a;
        }
        return bean;
    }
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("Before init: " + beanName);
        return bean;
    }
}

Spring 配置

<bean id="animal" class="ioc.test.Animal">
    <property name="age" value="5"/>
    <property name="name" value="豬"/>
</bean>
<bean id="beanPost" class="ioc.test.BeanPost"/>

測試與結果

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Animal animal = (Animal) ac.getBean("animal");
System.out.println(animal.speak());
// 輸出:我的名字是:猴子,年齡是:50!

配置文件注入的「豬、5歲」被後處理器改為「猴子、50歲」,驗證機制生效。

應用場景

  • 統一注入通用依賴(如 DataSource、ThreadPool)。
  • 實現介面代理(AOP 底層即基於此)。
  • 驗證 Bean 狀態、修正配置錯誤。
  • 資源預熱、指標註冊等生命週期擴展。

注意事項

  • 回調中返回的物件將替換原 Bean,若返回 null 會導致後續獲取失敗。
  • 不要在 postProcessBeforeInitialization 中依賴 Bean 的初始化狀態(如 @Autowired 欄位尚未填充)。
  • 大量 Bean 時效能影響可忽略,但邏輯應保持輕量。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved