Spring实战Day6

3.4 bean的作用域

  1. Spring中bean的作用域

    单例(Singleton):在整个应用中,只创建bean的一个实例。
    原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
    会话(Session):在Web应用中,为每个会话创建一个bean实例。
    请求(Rquest):在Web应用中,为每个请求创建一个bean实例。

  2. 什么时候可以是同一个实例

    Spring应用上下文中所有bean默认都是作为以单例(singleton)的形式创建,不管被注入到其他bean多少次,每次所注入的都是同一个实例

    Singleton适用于无状态的bean,比如一个Service,Dao或者Controller。他们都没有自己的状态,而是根据传输的参数执行一些操作

  3. 什么时候不要用单例

    比如购物车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
    ```

    <aop:scoped-proxy />

posted @ 2019-03-18 23:42  愉快的白萝卜  阅读(102)  评论(0)    收藏  举报