名师讲坛:Spring实战开发(Redis+SpringDataJPA+SpringMVC+SpringSecurity)
上QQ阅读APP看书,第一时间看更新

3.6 Bean的实例化管理

默认情况下,只要在Spring配置文件中定义了对象,容器就会自动对其进行实例化处理,而后就可以通过容器直接获取实例化对象,这样开发者就不用再关注对象的创建与回收过程。但是对象是什么时候被创建的?又被创建了多少次呢?本节将针对Spring中的Bean管理进行演示说明。

1.【mldnspring-base项目】为了方便观察,首先定义Dept程序类,并且提供构造方法输出。

本程序在类中定义了构造方法,并且调用了父类的toString方法,以获取对象的编号信息,观察实例化对象的个数。

2.【mldnspring-base项目】在spring-base.xml配置文件中定义Bean。

3.【mldnspring-base项目】编写一个主类,实现容器启动,但不通过容器获取任何的Bean对象。

此时,程序只启动了Spring容器,并没有任何调用。控制台中可以发现此时已成功实现了Bean对象的实例化,所以可以证明,当Spring容器启动时会自动根据配置文件的定义实现Bean的反射实例化。

4.【mldnspring-base项目】创建3个线程对象,并且实现Dept实例化对象获取,观察对象产生个数。

可以发现,默认情况下Spring对配置文件中定义的Bean只会实例化一次。而后不管如何获取Bean对象,都只会获得相同的Bean,即Spring中默认采用的是单例设计模式。

5.【mldnspring-base项目】如果不希望Spring中的对象采用单例设计模式,可以在Bean配置中进行修改。

此时程序中配置了scope="prototype",表示在Spring容器启动时不会自动进行Bean的实例化,只在需要的时候实例化新的Bean对象。

提示:不要改变默认的单例配置。

Spring的核心功能就是对Bean进行合理管理,所以在实际开发中很少会见到取消单例配置的处理操作。如果要在Bean中配置单例,可以采用如下默认配置。

本配置中使用scope="singleton"明确表示此Bean为单例设计。当然,这也是默认配置。

6.【mldnspring-base项目】重新启动测试程序类,观察单例取消后的信息输出。

此时创建了3个实例化对象,即每次通过容器获取对象时都需要创建新的实例化对象返回。

7.【mldnspring-base项目】进行单例设计时,有饿汉式与懒汉式两种类型。Spring默认采用的是饿汉式单例设计,这样在Spring容器启动时可以自动实现Bean的实例化处理。如果有需要,也可将其修改为懒汉式加载,即延迟进行初始化。

本配置中使用了lazy-init="true",这样只有在第一次获取Bean对象时才会被实例化处理。Spring的存在使得懒汉设计模式中不需要再考虑多线程的同步处理问题。