成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring 這六種初始化 Bean 的方式,個個是精華!

開發
在 Spring中,有多少種 Bean初始化的方式,這些方式有什么優缺點?我們該如何選擇?這篇文章,我們來聊一聊。

作為一個 Java開發工程師,Spring應該是接觸最多的一個框架,而 Bean又是 Spring的基石。那么,在 Spring中,有多少種 Bean初始化的方式,這些方式有什么優缺點?我們該如何選擇?這篇文章,我們來聊一聊。

總體來說,Spring初始化Bean 包含以下6種方法:

1. XML配置方式

在 Spring發展初期,XML配置方式是最傳統也是最流行的初始化方式,盡管如今大家更多選擇注解方式,但了解這個"祖傳手藝"還是很有必要的。

如下示例,展示了如何使用XML配置初始化和銷毀方法:

<bean id="testService" class="com.yuanjava.TestService" init-method="init" destroy-method="cleanup"/>

對應的Java類:

public class TestService {
    public void init() {
        System.out.println("XML配置的init方法被調用啦!");
    }
    
    public void cleanup() {
        System.out.println("XML配置的destroy方法被調用啦!");
    }
}

優點:

  • 集中式管理:一個XML文件就可以管理多個Bean的初始化和銷毀邏輯。
  • 修改無需重新編譯:直接改了XML配置重啟就行,不用重新打包部署
  • 解耦性極強:配置和實現完全分離的方式,特別適合需要頻繁切換實現的場景
  • 歷史兼容性好:早期的Spring版本也支持XML配置,不影響現有的項目

缺點:

  • 配置冗長:XML配置文件比較冗長,維護成本大
  • 類型不安全:編譯期不報錯,如果XML配置有錯誤,需要運行時會報錯
  • 重構困難: 當你重命名一個類時,IDE不會自動更新XML中的class屬性

思考題:有沒有小伙伴還記得,為什么我們那時候要在 XML里配init-method,而不是直接在類里寫個構造方法呢?(答案后面揭曉)

2. 注解方式

隨著 Spring 生態的發展,特別是 Spring Boot的普及,注解方式已經才能開發者的標配,下面是一個簡單的示例:

@Component
public class TestService {
    
    @PostConstruct
    public void postConstruct() {
        System.out.println("@PostConstruct方法執行了");
    }
    
    @PreDestroy
    public void preDestroy() {
        System.out.println("@PreDestroy方法執行了");
    }
}

優點:

  • 代碼即配置:只需要寫注解,就能完成初始化和銷毀邏輯
  • 強大的IDE支持:IDE可以直接幫你生成這兩個方法,無需手動寫
  • 類型安全:編譯期檢查,IDE會報錯,防止出錯

缺點:

  • 分散式配置:一個類只能管理一個Bean的初始化和銷毀邏輯,不夠集中
  • 修改需要重新編譯:直接改了Java代碼,需要重新打包部署
  • 運行時開銷:啟動時Spring需要掃描所有注解,會造成一定的性能損耗

3. InitializingBean接口

如果你想玩深度,那么InitializingBean接口絕對是首選,它是 Spring的親兒子,這個接口中定義了一個方法:

@Component
public class TestService implements InitializingBean {
    
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean的afterPropertiesSet方法被調用");
    }
}

優點:

  • 絕對執行順序保證:只要實現了InitializingBean接口,就能保證初始化的順序
  • 框架原生支持:Spring框架本身就支持InitializingBean,Spring的親兒子待遇
  • 明確契約:實現接口是一種顯式的契約聲明

缺點:

  • 單一方法限制:只能實現一個初始化方法,不夠靈活
  • 異常處理尷尬:只能拋出異常,無法返回值,不夠靈活

雖然這種方式很直接,但因為它把代碼和 Spring框架耦合在一起了,所以現在不太推薦使用。不過了解它有助于我們理解 Spring的原理。

4. @Bean的 initMethod屬性

@Bean的 initMethod屬性采用了配置類的玩法,示例代碼如下:

@Configuration
publicclass AppConfig {
    @Bean(initMethod = "init", destroyMethod = "cleanup")
    public FancyService fancyService() {
        returnnew FancyService();
    }
}

publicclass FancyService {
    public void init() {
        System.out.println("@Bean的initMethod指定的方法");
    }
    
    public void cleanup() {
        System.out.println("@Bean的destroyMethod指定的方法");
    }
}

優點:

  • 無侵入性:不需要改動原來的類,只需要改動配置文件,就能完成初始化和銷毀邏輯
  • 統一生命周期管理:所有Bean的生命周期方法名在配置處一目了然,特別適合需要嚴格規范的中大型項目

缺點:

  • 方法名硬編碼:全部通過 initMethod = "xxx"命名,存在重構風險
  • 調試困難:initMethod的調用被Spring代理層層包裹

大家有沒有注意到,這里的 destroyMethod有個隱藏特性?如果我把cleanup方法改個名,但不改destroyMethod配置,會發生什么?

5. BeanPostProcessor

這個可就厲害了,它能插手所有 Bean的初始化過程:

@Component
publicclass TestProcessor implements BeanPostProcessor {
    
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        System.out.println("Before初始化: " + beanName);
        return bean;
    }
    
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        System.out.println("After初始化: " + beanName);
        return bean;
    }
}

優點:

  • 全局控制:可以使用該技術在不修改業務代碼的情況下,為整個系統添加了方法調用日志
  • AOP基礎:Spring AOP就是通過BeanPostProcessor實現的(具體是AbstractAutoProxyCreator)

缺點:

  • 性能損耗:要求所有 BeanPostProcessor必須加@Order和嚴格的異常處理
  • 調試困難:復雜的調用棧

6. @EventListener

Spring的@EventListener事件機制也可以用來做初始化:

@Component
public class EventInitService {
    
    @EventListener(ContextRefreshedEvent.class)
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("容器刷新完畢,開始執行初始化邏輯");
    }
}

優點:

  • 松耦合設計:事件發布者和監聽者完全解耦
  • 靈活監聽:支持多事件類型、條件過濾
  • 異步支持:簡單注解即可實現異步處理
  • 順序控制:通過@Order指定監聽順序

缺點:

  • 調試困難:事件鏈路追蹤復雜
  • 類型安全:運行時才能發現事件類型不匹配
  • 性能風險:同步事件會阻塞發布者線程
  • 事務邊界:事件處理與事務的交互需要特別注意

7. Bean初始化順序

上面,我們已經分析了 6種初始化方式,那么,這幾種方式的順序是什么?來,看一個綜合例子:

@Component
publicclass OrderDemoBean implements InitializingBean {
    
    public OrderDemoBean() {
        System.out.println("1. 構造方法");
    }
    
    @PostConstruct
    public void postConstruct() {
        System.out.println("3. @PostConstruct");
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("4. InitializingBean");
    }
    
    public void initMethod() {
        System.out.println("5. init-method");
    }
}

// 配合BeanPostProcessor的輸出,完整順序是:
// 1. 構造方法
// 2. BeanPostProcessor的postProcessBeforeInitialization
// 3. @PostConstruct
// 4. InitializingBean
// 5. init-method
// 6. BeanPostProcessor的postProcessAfterInitialization

記憶口訣:構造-BeforePost-@PostConstruct-AfterProperties-initMethod-AfterPost

8. 總結

本文,我們一起分析了Spring中 6種 Bean初始化的方式以及他們的優缺點(未做很深的原理解析),在實際開發中,因為面對的業務需求不同,可能每種方式都會使用到,所以,作為開發者,建議 6種方式都要掌握。

責任編輯:趙寧寧 來源: 猿java
相關推薦

2025-02-27 00:00:30

SpringJava方式

2023-04-08 14:22:16

Spring初始化對象

2009-02-11 09:46:00

ASON網絡演進

2024-05-30 08:51:28

Spring數據分布式

2009-07-20 15:08:41

Spring實例化Be

2017-06-26 10:35:58

前端JavaScript繼承方式

2024-12-18 16:19:51

2024-10-29 11:27:27

2022-03-23 12:55:50

農業物聯網

2024-07-31 11:26:05

反射BeanXML

2023-12-01 10:20:00

SpringBean參數機制

2019-05-16 13:00:18

異步編程JavaScript回調函數

2021-12-08 13:20:39

Bean拷貝工具Java

2023-11-12 23:08:17

C++初始化

2022-12-06 10:39:43

Spring事務失效

2025-01-02 08:21:32

2021-01-08 10:52:22

物聯網萬物互聯IoT,Interne

2023-05-10 13:58:13

服務限流系統

2020-07-31 11:12:39

安全威脅網絡攻擊網絡安全

2020-04-27 09:00:00

雙因素認證身份認證生物識別
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 婷婷在线免费 | 久久久久国产 | 精品国产91乱码一区二区三区 | 色婷婷精品国产一区二区三区 | 亚洲一区二区在线播放 | 精品亚洲一区二区三区四区五区 | 欧美日日| 在线免费观看a级片 | 亚洲在线看 | 欧美精品久久久久久 | 九色porny自拍视频 | 超碰免费在线 | 久久久久国 | 一级片在线免费播放 | www.黄色在线观看 | 国产在线一区二区 | 51ⅴ精品国产91久久久久久 | 亚洲免费在线观看 | 懂色中文一区二区三区在线视频 | 久久亚洲高清 | 国产探花在线精品一区二区 | 91久久国产综合久久 | 成年人视频在线免费观看 | 国内精品免费久久久久软件老师 | 久久久久一区 | 亚洲一区视频在线 | 波多野结衣一区二区三区在线观看 | 国产视频精品在线 | www.久久影视 | 国产精品视频在线免费观看 | 亚洲精品久久久一区二区三区 | 午夜精品一区二区三区三上悠亚 | 日韩欧美一区二区三区免费观看 | 欧美日韩亚洲国产 | 精品国产欧美一区二区 | 久久精品亚洲精品国产欧美kt∨ | 国产精品中文字幕在线 | 女生羞羞网站 | 久久久久久国产精品免费免费男同 | 人人九九精 | 日本在线一区二区三区 |