Spring实战Day6
3.4 bean的作用域
-
Spring中bean的作用域
单例(Singleton):在整个应用中,只创建bean的一个实例。 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。 会话(Session):在Web应用中,为每个会话创建一个bean实例。 请求(Rquest):在Web应用中,为每个请求创建一个bean实例。 -
什么时候可以是同一个实例
Spring应用上下文中所有bean默认都是作为以单例(singleton)的形式创建,不管被注入到其他bean多少次,每次所注入的都是同一个实例
Singleton适用于无状态的bean,比如一个Service,Dao或者Controller。他们都没有自己的状态,而是根据传输的参数执行一些操作 -
什么时候不要用单例
比如购物车bean,它就应该被声明会话作用域内共享。假如它是一个单例,那么所有人都在这个购物车里放东西取东西。你只想买个电脑,但是最后就会发现你买了一些化妆品;或者你会有个提示,你需要等着没用其他用户使用购物车。每个人存在不同的状态,就不能使用单例,使用会话作用域bean是个更好的选择- 配置原型作用域
- 自动创建bean
@Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class LikeMePeople implements People{ } //or @Component @Scope("prototype") public class LikeMePeople implements People{ }- JavaConfig创建bean ``` @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public Talent getLiteraryTalent() { return new LiteraryTalent(); } ``` - XML创建bean ``` <bean class="cn.jqzhong.Spring.study.day2.LanguageTalent" scope="prototype"></bean> ```- 配置会话作用域
- 自动创建bean
@Component @Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=ScopedProxyMode.INTERFACES) public class ShoppingCart { }proxyMode=ScopedProxyMode.INTERFACES解决将会话或请求作用域的bean注入到单例bean中所遇到的问题 - XML创建bean ``` <bean class="cn.jqzhong.Spring.study.day6.ShoppingCart" scope="session"> - 配置原型作用域
<aop:scoped-proxy />

浙公网安备 33010602011771号