- 名師講壇:Spring實(shí)戰(zhàn)開發(fā)(Redis+SpringDataJPA+SpringMVC+SpringSecurity)
- 李興華
- 870字
- 2020-04-24 14:20:45
3.6 Bean的實(shí)例化管理
默認(rèn)情況下,只要在Spring配置文件中定義了對象,容器就會自動對其進(jìn)行實(shí)例化處理,而后就可以通過容器直接獲取實(shí)例化對象,這樣開發(fā)者就不用再關(guān)注對象的創(chuàng)建與回收過程。但是對象是什么時候被創(chuàng)建的?又被創(chuàng)建了多少次呢?本節(jié)將針對Spring中的Bean管理進(jìn)行演示說明。
1.【mldnspring-base項目】為了方便觀察,首先定義Dept程序類,并且提供構(gòu)造方法輸出。

本程序在類中定義了構(gòu)造方法,并且調(diào)用了父類的toString方法,以獲取對象的編號信息,觀察實(shí)例化對象的個數(shù)。
2.【mldnspring-base項目】在spring-base.xml配置文件中定義Bean。

3.【mldnspring-base項目】編寫一個主類,實(shí)現(xiàn)容器啟動,但不通過容器獲取任何的Bean對象。

此時,程序只啟動了Spring容器,并沒有任何調(diào)用。控制臺中可以發(fā)現(xiàn)此時已成功實(shí)現(xiàn)了Bean對象的實(shí)例化,所以可以證明,當(dāng)Spring容器啟動時會自動根據(jù)配置文件的定義實(shí)現(xiàn)Bean的反射實(shí)例化。
4.【mldnspring-base項目】創(chuàng)建3個線程對象,并且實(shí)現(xiàn)Dept實(shí)例化對象獲取,觀察對象產(chǎn)生個數(shù)。

可以發(fā)現(xiàn),默認(rèn)情況下Spring對配置文件中定義的Bean只會實(shí)例化一次。而后不管如何獲取Bean對象,都只會獲得相同的Bean,即Spring中默認(rèn)采用的是單例設(shè)計模式。
5.【mldnspring-base項目】如果不希望Spring中的對象采用單例設(shè)計模式,可以在Bean配置中進(jìn)行修改。

此時程序中配置了scope="prototype",表示在Spring容器啟動時不會自動進(jìn)行Bean的實(shí)例化,只在需要的時候?qū)嵗碌腂ean對象。
提示:不要改變默認(rèn)的單例配置。
Spring的核心功能就是對Bean進(jìn)行合理管理,所以在實(shí)際開發(fā)中很少會見到取消單例配置的處理操作。如果要在Bean中配置單例,可以采用如下默認(rèn)配置。

本配置中使用scope="singleton"明確表示此Bean為單例設(shè)計。當(dāng)然,這也是默認(rèn)配置。
6.【mldnspring-base項目】重新啟動測試程序類,觀察單例取消后的信息輸出。

此時創(chuàng)建了3個實(shí)例化對象,即每次通過容器獲取對象時都需要創(chuàng)建新的實(shí)例化對象返回。
7.【mldnspring-base項目】進(jìn)行單例設(shè)計時,有餓漢式與懶漢式兩種類型。Spring默認(rèn)采用的是餓漢式單例設(shè)計,這樣在Spring容器啟動時可以自動實(shí)現(xiàn)Bean的實(shí)例化處理。如果有需要,也可將其修改為懶漢式加載,即延遲進(jìn)行初始化。

本配置中使用了lazy-init="true",這樣只有在第一次獲取Bean對象時才會被實(shí)例化處理。Spring的存在使得懶漢設(shè)計模式中不需要再考慮多線程的同步處理問題。
- Design Principles for Process:driven Architectures Using Oracle BPM and SOA Suite 12c
- Mastering OpenCV Android Application Programming
- Python進(jìn)階編程:編寫更高效、優(yōu)雅的Python代碼
- Java面向?qū)ο蟪绦蛟O(shè)計
- The Professional ScrumMaster’s Handbook
- Maker基地嘉年華:玩轉(zhuǎn)樂動魔盒學(xué)Scratch
- PrimeFaces Blueprints
- QPanda量子計算編程
- 石墨烯改性塑料
- WildFly Cookbook
- INSTANT Apache Hive Essentials How-to
- Java程序設(shè)計入門(第2版)
- TensorFlow.NET實(shí)戰(zhàn)
- PHP高性能開發(fā):基礎(chǔ)、框架與項目實(shí)戰(zhàn)
- Developing RESTful Web Services with Jersey 2.0