专栏首页大闲人柴毛毛Spring速查手册(二)——Bean的作用域

Spring速查手册(二)——Bean的作用域

Bean的四种作用域

  • 单例(Singleton):整个应用中,只创建一个bean。
  • 原型(Prototype):每次注入或请求要给bean的时候都创建一个新的bean。
  • 会话(Session):每个session创建要给bean。
  • 请求(Request):每个WEB请求创建一个bean。

PS:Spring默认的bean是单例的!

使用会话/请求作用域的注意点

// 创建一个session的bean
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION)
public A a{ …… }

// 在单例bean中注入不同作用域的bean
@Component
public B b{
    @Autowired
    public void setA ( A a ) { …… }
}

上述代码会发生错误! 单例的bean在应用程序启动的时候就初始化,并在初始化时需要注入session作用域的B,但session作用域的bean只有当有用户的时候才创建,初始化的时候并没有该对象。 再者,不同的用户拥有不同的session,因此A对象将有成千上万,而B对象有且仅有一个。 此时需要在session作用域的bean对象上加上注解:

// 创建一个session的bean
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,
proxyMode=ScopeProxyMode.INTERFACES)
public A a{ …… }

该注解声明后,注入给单例的将是该bean的代理,代理维护着不同session下的bean,当单例对象调用的将是代理对象,代理对象根据当前的session将请求转发给制定的目标对象处理。

注意:若session作用域的对象无接口,则使用Cglib创建代理

// 创建一个session的bean
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,
proxyMode=ScopeProxyMode.TARGET_CLASS)
public A a{ …… }

在XML中开启对象代理

<!-- 开启java动态代理-->
<bean id="xxx" class="com.xxx.xxx" scope="session">
    <aop:scoped-proxy />
</bean>
<!-- 开启Cglib代理-->
<bean id="xxx" class="com.xxx.xxx" scope="session">
    <aop:scoped-proxy proxy-target-class="false" />
</bean>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 跟着柴毛毛学Spring(2)——Bean的配置

    Java中创建一个对象分两步: 1.通过关键字new创建一个对象 2.通过构造函数或setter函数为对象添加初始化参数 当Spring出现后,对象...

    大闲人柴毛毛
  • 深入剖析Spring(二)——IoC容器的实现

    Spring的两种IoC容器 BeanFactory 基础类型的IoC容器; 采用延迟初始化策略(容器初始化完成后并不会创建bean的对象,只有当收到初...

    大闲人柴毛毛
  • 跟着柴毛毛学Spring(3)——简化Bean的配置

    通过前面的学习,我们会感觉到对于一个有较多Bean的大项目,Spring的配置会比较复杂。那么接下来我们就介绍如何简化Spring的配置。 简化Spring的配...

    大闲人柴毛毛
  • 真没想到!三十步才能完成bean实例的创建

    本文已收录至我的GitHub 在容器启动快完成时,会把所有的单例bean进行实例化,也可以叫做预先实例化。 这样做的好处之一是,可以及早地发现问题,及早的抛出...

    Java3y
  • spring中Bean的作用域

    在Spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spri...

    MickyInvQ
  • day33_Spring学习回顾_01

    1、导入jar包:4 + 1 --> beans/core/context/expression + commons-logging

    黑泽君
  • Spring Bean的解析和加载详细解释

    Core Container 包含 Core,Beans,Context,Expression Language 模块 Core 和 Beans 提供 IOC...

    黑白格
  • 快速学习-Spring(Bean的生命周期)

    cwl_java
  • Spring获取Bean 源码浅析

    我想上面这行代码,第一次接触过spring这个框架时都应该接触过;读取xml中我们配置的bean;

    用户2141593
  • Spring Bean的加载

    不等bean创建完成就会将创建bean的ObjectFactory提早曝光加入到缓存中。

    WindWant

扫码关注云+社区

领取腾讯云代金券