bean的作用域

Spring 应用上下文中所有的bean都是以单例(singleton)的形式存在,简单的说,就是一个给定的bean无论被注入到其他的bean多少次,每次注入的都是相同的一个实例,即类.toString()是相同的。
优点:初始化和垃圾回收对象实例所带来的成本小。
·缺点:不能满足所有的需求。

Spring的作用域有:
· *单例(singleton)整个应用中,只创建bean的一个实例【默认】 ;
*多例(prototype):每次注入或者通过Spring 的应用上下文获取的时候,都会创建一个bean的实例 ;
简单的理解:用户打开浏览器,点击多个超链接,访问Web服务器上多个资源,然后关闭浏览器,整个过程称之为一次会话。
*会话(Session):在web应用中,为每个会话创建一个bean实例 ;
*请求(Request):在web应用中,为每个请求创建一个bean实例 ;
==================prototype===============
如果使用组件扫描来发现和声明bean,可以在bean类使用@Scope注解,
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class User{
..................
}
如果是在configuration类中,
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public User user(){
..................
}
在xml中配置bean
<bean id="user" class="............User" scope="prototype"/>
==============web应用中====================
*会话(Session):在web应用中,为每个会话创建一个bean实例 ;
作用:在电子商务应用中,可能会有一个bean代表用户的购物车。如果购物车是单例,肯定是不行的,如果是在多例的话,那么在应用的某一个地方往购物车添加的商品,在应用另外一个地方就不能用了,因为这里注入的是另外一个多例作用域的购物车。【其实可以用session来解决】
这时就可以使用会话的作用域了。
@Bean
@Scope(value=WebApplicationContext.SCOPE_SESSION,
proxyMode=ScopedProxyMode.INTERFACES)
public ShopCart cart(){......}
// proxyMode的解决了将会话域的bean注入到单例bean中所遇到的问题。
//proxyMode有两个值,①INTERFACES,当返回类型是接口类型时使用,因为注入到其他bean的是一个代理
②TARGET_CLASS:返回类型是实体类时,使用CGlib生成代理。

在XML中声明
①<bean id="cart" class="....Cart" scope="session" >
<aop:scoped-proxy />//默认是使用CGLib,即非接口
</bean>
②<bean id="cart" class="....Cart" scope="session" >
<aop:scoped-proxy proxy-target-class="false" />// 使用INTERFACES
</bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值