如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
在spring中,singleton属性默认是false,每次指定别名取得的Bean时都会产生一个新的实例
可以在Bean定义文件中使用"init-method"属性,执行到这个阶段时,就会执行initBean()方法
如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法
创建:<bean name=”” class=”” 额外属性>
初始化:配置init-method/实现接口InitializingBean
调用:context.getBean(),进行方法的调用
销毁:配置destroy-method/实现DisposableBean接口。
如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。 可以在Bean定义文件中使用"init-method"属性,执行到这个阶段时,就会执行initBean()方法。
如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法。
创建:<bean name=”” class=”” 额外属性>
初始化:配置init-method/实现接口InitializingBean
调用:context.getBean(),进行方法的调用
销毁:配置destroy-method/实现DisposableBean接口。
public class BeanFactoryHelper implements BeanFactoryAware { private static BeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } public static Object getBean(String beanName){ if(beanFactory == null){ throw new NullPointerException("BeanFactory is null!"); } return beanFactory.getBean(beanName); } }
目前,scope的取值有5种取值:
在Spring 2.0之前,有singleton和prototype两种;
此取值时表明容器中创建时只存在一个实例,所有引用此bean都是单一实例。如同每个国家都有一个***,国家的所有人共用此***
spring容器在进行输出prototype的bean对象时,会每次都重新生成一个新的对象给请求方,虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要准备完毕,并且对象实例返回给请求方之后,容器就不在拥有当前对象的引用,请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁。也就是说,容器每次返回请求方该对象的一个新的实例之后,就由这个对象“自生自灭”,最典型的体现就是spring与struts2进行整合时,要把action的scope改为prototype。
如同分苹果,将苹果的bean的scope属性声明为prototype,在每个人领取苹果的时候,我们都是发一个新的苹果给他,发完之后,别人爱怎么吃就怎么吃,爱什么时候吃什么时候吃,但是注意吃完要把苹果核扔到垃圾箱!对于那些不能共享使用的对象类型,应该将其定义的scope设为prototype。
在Spring 2.0之后,为支持web应用的ApplicationContext,增强另外三种:request,session和global session类型,它们只实用于web程序,通常是和XmlWebApplicationContext共同使用。可以用scope属性来限定bean的生命范围(即是在什么范围内拿到的bean是相同的)
singleton:在整个应用的里面,拿取bean,都是同一个bean的引用(类似于单例模式);singleton也是默人的scope;
prototype:(原型模式)每次拿一个对象,都是对"原型"对象的一次拷贝;每拿一次就是通过拷贝原型来创建一个新的对象;
注意:如果bean的scope是prototype,spring不会自动的调用destory-method;
request :
在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会创建一个新的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。
session:
在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
global session :
在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。
Scope描述的是Spring容器如何新建Bean实例的。Spring的Scope有以下几种,通过@Scope注解来实现。
(1)Singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例。
(2)Prototype:每次调用新建一个Bean实例。
(3)Request:Web项目中,给每一个 http request 新建一个Bean实例。
(4)Session:Web项目中,给每一个 http session 新建一个Bean实例。
(5)GlobalSession:这个只在portal应用中有用,给每一个 global http session 新建一个Bean实例。