Spring中的bean默认都是单例的
一共有5种作用域:singleton、prototype、request、session和global session
设置方式只需要在形如:<bean id="XXX" class="com.mori.XXX" scope="singleton" />
1、Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。
2、Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。
另外三种作用域仅在基于web的应用中使用,作用域自行体会
我们可以指定bean节点的lazy-init="true"来延迟初始化bean,这时候,只有在第一次获取bean时才会初始化bean,即第一次请求该bean时才初始化。
形如:<bean id="XXX" class="com.mori.XXX" scope="singleton" lazy-init="true" />
在单例模式中,Spring在创建对象的时候先调用构造器,然后调用init-method属性值中所指定的方法。对象在被销毁的时候,会调用destroy-method属性值中所指定的方法。
形如:<bean id="XXX" class="com.mori.XXX" scope="singleton" init-method="init" destroy-method="destory" lazy-init="true" /> init以及destory都是这个bean中的方法。
在非单例模式中,请求每一个prototype的bean时,Spring容器都会调用其构造器创建这个对象,然后调用init-method属性值中所指定的方法。对象销毁的时候,Spring容器不会帮我们调用任何方法,因为是非单例,这个类型的对象有很多个,Spring容器一旦把这个对象交给你之后,就不再管理这个对象了。
Bean的生命周期:
1、Spring对bean进行实例化,默认bean是单例
2、Spring对bean进行依赖注入
3、检查该bean是不是实现了指定的接口,有spring就去调用这些实现的方法,包括上面说的init-method属性声明
4、此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中
5、销毁时也是看有没有实现指定销毁接口,或者destroy-method属性声明
参考:https://blog.csdn.net/fuzhongmin05/article/details/73389779