注:原创作品,转载请注明出处
Spring提供五种选择让用户决定bean的作用范围:
1,Singleton:单例模式,在整个Spring ioc中。使用singleton定义的bean将只有一个实例。
例如:
测试java代码:
输出:true
2,prototype 原型模式:每次通过spring容器的getBean都将产生一个新的实例
例如:
spring配置文件:
java测试代码:
输出: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以后):
第一种配置方法(Servlet2.4以前):
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>