Spring创建bean的scope选择
程序员文章站
2022-07-06 15:41:12
...
注:原创作品,转载请注明出处
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>
上一篇: 原型模式--Prototype
下一篇: 关于复选框多重值传到后台的问题
推荐阅读
-
品Spring:SpringBoot轻松取胜bean定义注册的“第一阶段”
-
详解Spring Bean的循环依赖解决方案
-
Spring boot创建自定义starter的完整步骤
-
Spring中Bean的生命周期使用解析
-
spring如何使用命名空间p简化bean的配置
-
JSP 开发之Spring Boot 动态创建Bean
-
spring5 源码深度解析----- 被面试官给虐懵了,竟然是因为我不懂@Configuration配置类及@Bean的原理
-
Spring学习之Bean的装配多种方法
-
通过实例解析spring bean之间的关系
-
spring源码分析系列5:ApplicationContext的初始化与Bean生命周期