Wetts's blog

Stay Hungry, Stay Foolish.

0%

依赖注入-XML配置-bean的生命周期

在低版本的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
2
3
4
5
6
<bean id="car" class="" scope="request">
<aop:scoped-proxy />
</bean>
<bean id="boss" class="">
<property name="car" ref="car" />
</bean>

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。