![名师讲坛: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=1739252463-0dzWAjvvmLAzYsH4SrPqFIL6OfalG1Pw-0-5589acdff041ecf8c60094426ef72e47)
本程序在类中定义了构造方法,并且调用了父类的toString方法,以获取对象的编号信息,观察实例化对象的个数。
2.【mldnspring-base项目】在spring-base.xml配置文件中定义Bean。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer656.jpg?sign=1739252463-afZh0fhh47ZIC4C6I2z11cf3ICC6SHHd-0-03bdf1feebd4615775d1be58af97e182)
3.【mldnspring-base项目】编写一个主类,实现容器启动,但不通过容器获取任何的Bean对象。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer657.jpg?sign=1739252463-p4YN6GakTIJPNdR8KF2nJ0aavA6LZG36-0-e5ce8404c2a7beb917cb364305db0bbb)
此时,程序只启动了Spring容器,并没有任何调用。控制台中可以发现此时已成功实现了Bean对象的实例化,所以可以证明,当Spring容器启动时会自动根据配置文件的定义实现Bean的反射实例化。
4.【mldnspring-base项目】创建3个线程对象,并且实现Dept实例化对象获取,观察对象产生个数。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer659.jpg?sign=1739252463-u7oKqjtBLeO8FWNMWB4KwZCJ4gDgDzr1-0-f72742e9cc7110b4a4493ad00b45262a)
可以发现,默认情况下Spring对配置文件中定义的Bean只会实例化一次。而后不管如何获取Bean对象,都只会获得相同的Bean,即Spring中默认采用的是单例设计模式。
5.【mldnspring-base项目】如果不希望Spring中的对象采用单例设计模式,可以在Bean配置中进行修改。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer660.jpg?sign=1739252463-wuUMgvoLI1OushQbSLca1piJozek2AcG-0-7e141ece6d90ef6c9494b7f6a9d51a51)
此时程序中配置了scope="prototype",表示在Spring容器启动时不会自动进行Bean的实例化,只在需要的时候实例化新的Bean对象。
提示:不要改变默认的单例配置。
Spring的核心功能就是对Bean进行合理管理,所以在实际开发中很少会见到取消单例配置的处理操作。如果要在Bean中配置单例,可以采用如下默认配置。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer661.jpg?sign=1739252463-Sh34pyUtQB9LTXKtgksGzkf0taM068JC-0-939457b179f2727eb940fb924df6da31)
本配置中使用scope="singleton"明确表示此Bean为单例设计。当然,这也是默认配置。
6.【mldnspring-base项目】重新启动测试程序类,观察单例取消后的信息输出。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer662.jpg?sign=1739252463-5fOJN2QqORT3SCsrgMlWlBLhmIvSNhIl-0-4c733b00d5bd90ce0b43104ef5fff5a4)
此时创建了3个实例化对象,即每次通过容器获取对象时都需要创建新的实例化对象返回。
7.【mldnspring-base项目】进行单例设计时,有饿汉式与懒汉式两种类型。Spring默认采用的是饿汉式单例设计,这样在Spring容器启动时可以自动实现Bean的实例化处理。如果有需要,也可将其修改为懒汉式加载,即延迟进行初始化。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer663.jpg?sign=1739252463-XQQ03wWcZisk1nvrETTxPfniOjuKNUkf-0-2cedf0479b2273a01ebd70b9df866827)
本配置中使用了lazy-init="true",这样只有在第一次获取Bean对象时才会被实例化处理。Spring的存在使得懒汉设计模式中不需要再考虑多线程的同步处理问题。