在低版本的Spring中,由于只有两个Bean作用域,所以采用singleton="true|false"
的配置方式,Spring为了向后兼容,依旧支持这种配置方式。不过,Spring推荐采用新的配置方式:scope=”作用域类型”。
scope分类
- singleton
- prototype
- request
- session
- globalSession
Spring默认是singleton。在启动容器的时候默认实例化,并缓存于容器中。如果用户不希望在容器启动的时候提前实例化singleton的Bean,可以通过lazy-init=”true”来进行控制。
自定义作用域
可以通过org.springframework.beans.factory.config.Scope
接口定义新的作用域,再通过org.springframework.beans.factory.config.CustomScopeConfigurer
这个BeanFactoryPostProcessor注册自定义的Bean作用域。
Web相关作用域的Bean注入
将Web相关作用域的Bean注入到singleton或prototype的Bean中,我们需要在配置文件中添加<aop:scoped-proxy />
,使引用者从指定的域中取得应用。
1 | <bean id="car" class="" scope="request"> |
car Bean是request作用域,它被singleton作用域的boss Bean引用。为了boss能够从适当作用域中获取car Bean的引用,需要使用Spring AOP的语法为car Bean配置一个代理类。
在boss Bean在Web环境下,调用car Bean时,Spring AOP将启动动态代理只能判断boss Bean位于哪个HTTP请求线程中,并从对应的HTTP请求线程中获取对应的car Bean。
boss Bean的作用域是singleton,也就是说,在Spring容器中始终只有一个实例,而car Bean的作用域为request,所以每个调用到car Bean的那些HTTP请求都会创建一个car Bean。Spring通过动态代理技术,能够让boss Bean引用到对应HTTP请求的car Bean。