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   
    ```
    <bean class="cn.jqzhong.Spring.study.day6.ShoppingCart" scope="session">
    

<aop:scoped-proxy />

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