欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring创建bean的scope选择

程序员文章站 2022-07-06 15:41:12
...
   注:原创作品,转载请注明出处

Spring提供五种选择让用户决定bean的作用范围:
1,Singleton:单例模式,在整个Spring ioc中。使用singleton定义的bean将只有一个实例。
   例如:
   <bean id="userDao" class="com.supan.dao.imp.UserDaoImp" scope="singleton">
       <property name="sessionFactory" ref="sessionFactory"></property>
   </bean> 


    测试java代码:
     public void testSpringScope()
     {
    	 UserDao ud1 = (UserDao)ctx.getBean("userDao");
    	 
    	 UserDao ud2 = (UserDao)ctx.getBean("userDao");
    	 
    	 System.out.println(ud1 == ud2);
     }


     输出:true

2,prototype 原型模式:每次通过spring容器的getBean都将产生一个新的实例
   例如:
   spring配置文件:
    <bean id="userDao" class="com.supan.dao.imp.UserDaoImp" scope="prototype">
       <property name="sessionFactory" ref="sessionFactory"></property>
    </bean> 


   java测试代码:
        /**
      * <测试spring配置bean的属性scopt的作用>
      */
     public void testSpringScope()
     {
    	 UserDao ud1 = (UserDao)ctx.getBean("userDao");
    	 
    	 UserDao ud2 = (UserDao)ctx.getBean("userDao");
    	 
    	 System.out.println(ud1 == ud2);
     }


    输出:false

3,request:对于每次http请求,使用request定义的bean都将产生一个新的实例。注:只有在web容器使用spring时,这个作用域才生效。

   <bean id="LoginAction" class="com.supan.LoginAction" scope="request">

4,session:对于每次http session请求,使用session定义的bean都将产生一个新的实例。。注:只有在web应用中使用spring,此作用域才能生效。

   由于本机上没有j2ee环境,没有实例展出。

5,global session:每个全局的Http session对应一个bean实例,典型情况下,仅在使用portletcontext的时候才有效。注:只有在web应用中使用spring,此作用域才能生效。
 
     由于本机上没有j2ee环境,没有实例展出。

 
最后写一点:使用经验:
1,   Sington是单例模式,由ioc容器管理,不是线程安全的。
      若类是无状态的,那么sington性能要高一点,因为只有一个实例。
      若类是有状态的,那么必须把scope设置成prototype。

2,   在ssh2项目中struts的action是有状态的,必须显示设置成scope="prototype",prototype是原型模式,每次action请求过来都会创建一个新的action。
   而对于dao的实现类,推介使用scope = "sington" 因为这些类没有状态,

3,比较常用的是singleton,和prototype两种作用域。
4,spring默认的作用域是singleton(这样最省系统资源),如非必要,请不要随便用prototype作用域(比较消耗系统资源)
5,在使用request,session,global session需要在spring中额外的配置。
  第一种配置方法(Servlet2.4以后):
  <listener>
      <listener-class>
           org.springframework.web.context.request.RequestContextListener
      </listener-class>
  </listener>

   第一种配置方法(Servlet2.4以前):
   <filter>
    <filter-name>requestContextFilter></filter-name>
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
   </filter>

    <filter-mapping>
      <filter-name>requestContextFilter</filter-name>
      <url-pattern>/*</url-pattern>
     </filter-mapping>


相关标签: spring prototype