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