![名师讲坛:Spring实战开发(Redis+SpringDataJPA+SpringMVC+SpringSecurity)](https://wfqqreader-1252317822.image.myqcloud.com/cover/156/29977156/b_29977156.jpg)
3.6 Bean的实例化管理
默认情况下,只要在Spring配置文件中定义了对象,容器就会自动对其进行实例化处理,而后就可以通过容器直接获取实例化对象,这样开发者就不用再关注对象的创建与回收过程。但是对象是什么时候被创建的?又被创建了多少次呢?本节将针对Spring中的Bean管理进行演示说明。
1.【mldnspring-base项目】为了方便观察,首先定义Dept程序类,并且提供构造方法输出。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer655.jpg?sign=1739193258-hn7wYZ9k0RQx4BttFC6lvMy71t2sP9LY-0-9ec939dd99a9a9f306d160d66c6560f0)
本程序在类中定义了构造方法,并且调用了父类的toString方法,以获取对象的编号信息,观察实例化对象的个数。
2.【mldnspring-base项目】在spring-base.xml配置文件中定义Bean。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer656.jpg?sign=1739193258-4ERaL2qmB1s9jSJSZygsWtVPfhXzFhch-0-3e397707bc4081246171c0b5663b3e87)
3.【mldnspring-base项目】编写一个主类,实现容器启动,但不通过容器获取任何的Bean对象。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer657.jpg?sign=1739193258-7Or0qyZgcfpAG868YwVMWiY6QDhdS5yW-0-40fc82f5dacea75c3a4d01e950af3387)
此时,程序只启动了Spring容器,并没有任何调用。控制台中可以发现此时已成功实现了Bean对象的实例化,所以可以证明,当Spring容器启动时会自动根据配置文件的定义实现Bean的反射实例化。
4.【mldnspring-base项目】创建3个线程对象,并且实现Dept实例化对象获取,观察对象产生个数。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer659.jpg?sign=1739193258-qAGxnZBBFcSRby7DWrzYdpLF9EIWsSw4-0-40fe98276b63c7e7a9371a6d92235864)
可以发现,默认情况下Spring对配置文件中定义的Bean只会实例化一次。而后不管如何获取Bean对象,都只会获得相同的Bean,即Spring中默认采用的是单例设计模式。
5.【mldnspring-base项目】如果不希望Spring中的对象采用单例设计模式,可以在Bean配置中进行修改。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer660.jpg?sign=1739193258-4h8pg0AfF10Za0PkjkDIkDftu10oYTxs-0-acd52e9c1510efb3cefa4cf1b9d20560)
此时程序中配置了scope="prototype",表示在Spring容器启动时不会自动进行Bean的实例化,只在需要的时候实例化新的Bean对象。
提示:不要改变默认的单例配置。
Spring的核心功能就是对Bean进行合理管理,所以在实际开发中很少会见到取消单例配置的处理操作。如果要在Bean中配置单例,可以采用如下默认配置。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer661.jpg?sign=1739193258-jn1zsK2CE29x79MsAUABpAGn71DE7LlD-0-a4e7cfb6d97f815565bd11845eb5c1f4)
本配置中使用scope="singleton"明确表示此Bean为单例设计。当然,这也是默认配置。
6.【mldnspring-base项目】重新启动测试程序类,观察单例取消后的信息输出。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer662.jpg?sign=1739193258-QeRPLnFeSD9xT5uQU1V2x51Xwxk9Qh9m-0-c48e31017e58b0376a726eef957f2fc9)
此时创建了3个实例化对象,即每次通过容器获取对象时都需要创建新的实例化对象返回。
7.【mldnspring-base项目】进行单例设计时,有饿汉式与懒汉式两种类型。Spring默认采用的是饿汉式单例设计,这样在Spring容器启动时可以自动实现Bean的实例化处理。如果有需要,也可将其修改为懒汉式加载,即延迟进行初始化。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer663.jpg?sign=1739193258-YQr9UyT3k0YoevuPgZRmTmg5W63vDC6z-0-42080d640af51be4304cf4bec8c7bc5b)
本配置中使用了lazy-init="true",这样只有在第一次获取Bean对象时才会被实例化处理。Spring的存在使得懒汉设计模式中不需要再考虑多线程的同步处理问题。