`
y806839048
  • 浏览: 1107448 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

作为依赖关系的Scoped不同的 Bean

阅读更多
<aop:scoped-proxy/>  确保长生命周期中依赖的短对象,会即时随着生命周期的结束而销毁

 

首先看一下Spring文档上的两个例子对比:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
<bean id="userManager" class="com.foo.UserManager">
    <property name="userPreferences" ref="userPreferences"/>
</bean>

另外一个例子:


<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
    <aop:scoped-proxy/>
</bean>

<bean id="userManager" class="com.foo.UserManager">
    <property name="userPreferences" ref="userPreferences"/>
</bean>

前一个例子没有使用<aop:scoped-proxy/>,并且userManager是singleton,所有userManager仅被初始化一次,并且其属性userPreferences也仅被注射一次。当session失效后,userManager仍将保留userPreferences实例。但后一个例子则不一样,userManager的属性userPreferences指向的是com.foo.UserPreferences实例的代理,当session过期后,userManager的属性userPreferences自然也不能再使用。

项目中代码如下:

 
<bean id="pvgInfo" class="com.alibaba.tboss.common.auth.privilege.PrivilegeInfo" scope="pvgscope">
            <aop:scoped-proxy />
</bean>

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
            <property name="scopes">
                <map>
                    <entry key="pvgscope">
                        <bean class="com.alibaba.tboss.common.auth.scope.PvgScope" />
                    </entry>
                </map>
            </property>
</bean>


public class PvgScope extends RequestScope {
    public Object get(String name, ObjectFactory objectFactory) {
        Object scopedObject = null;
        try {
            if (RequestContextHolder.getRequestAttributes() == null) {
                scopedObject = PrivilegeInfo.getDummyPrivilegeInfo();
            }
            scopedObject = super.get(name, objectFactory);
        } catch (IllegalStateException e) {
            scopedObject = PrivilegeInfo.getDummyPrivilegeInfo();
        }

        return scopedObject;
    }
}
 

如果题主只考虑容器对bean的实例化,scoped-proxy确实没什么意义。

scoped-proxy的意义在关联bean之间的依赖时才能体现。

这里userManager的作用域是singleton,也就是容器中仅初始化一次。 
假设userPreferences因为userManager的作用域的原因只能被注入一次,换句话说,userManager以后使用的userPreferences永远都是同一个。 
这样比较反直觉,我明明把userPreferences声明为session作用域,结果用到的时候跟这个作用域没有任何关系。

那么proxy,它代理的工作就是——暴露这个bean时令其符合其作用域的特性。

 
 
分享到:
评论

相关推荐

    web bean(中文参考).doc

    然而,与有状态会话Bean不同,Web Bean的实例生命周期不由客户端直接控制,而是由Web Bean的范围决定。范围定义了实例的生命周期以及哪些客户端可以共享特定实例的引用。 Web Bean的生命周期由Web Bean管理器管理,...

    JSF2-Annotations.pdf

    通过使用`@ManagedProperty`,开发者可以在托管Bean中声明对另一个托管Bean的依赖关系,而无需手动进行查找和设置。这种方式极大地简化了代码结构,提高了可维护性。 综上所述,JSF2.0通过引入各种注解,显著提升了...

    webbeans_reference

    总之,WebBeans 作为一种现代的依赖注入框架,为 Java 开发者提供了一种高效、简洁的方式来管理应用程序中的组件依赖关系。通过学习上述概念和实践,开发者可以更好地利用 WebBeans 来构建高质量的企业级应用。

    Pro CDI 2 in Java EE 8

    开发者可以利用这些API模拟不同的上下文和依赖关系,以进行单元测试和集成测试。 总的来说,《Pro CDI 2 in Java EE 8》这本书是学习和精通CDI 2.0的宝贵资源,对于想要深入了解Java EE 8开发的程序员来说,它涵盖...

    一个学习CDI不错的例子

    1. **CDI注解**:例如`@Inject`用于注入依赖,`@Named`用于将bean命名以便注入,`@Singleton`、`@RequestScoped`等定义bean的生命周期和范围。 2. **生产者方法(Producer Methods)**:当标准的注解不能满足复杂的...

    jsf 的Annotations配置

    1. `@ManagedBean`:这个注解用于标记一个类作为JSF管理Bean。例如: ```java @ManagedBean @RequestScoped public class MyBean { // ... } ``` 这里的`MyBean`就是一个被JSF管理的Bean,其作用域为请求。 2. `@...

    JavaEE6 CDI规范的使用1

    1. **依赖注入(Dependency Injection, DI)**:允许开发者声明性地定义对象之间的依赖关系,而无需手动创建和管理对象。这降低了代码的耦合度,提高了可测试性和可维护性。 2. **上下文(Contexts)**:CDI可以...

    webbeans 入门手册

    CDI是Java企业级应用程序中的一个关键组件,它提供了一种统一的方式来管理对象(称为bean)以及它们之间的依赖关系。本手册将帮助开发者深入理解WebBeans框架,并学会如何在实际项目中有效利用这一强大的工具。 **1...

    webbeans(weld1.0)完全教程

    Weld作为CDI的核心实现,支持注解驱动的编程模型,允许开发者使用`@Inject`、`@Named`、`@Qualifier`等注解来声明和管理对象之间的依赖。 1. **依赖注入(Dependency Injection, DI)**:DI是WebBeans的核心特性,...

    Spring-Mybatis-JSF

    Spring作为容器,负责管理Bean的生命周期和依赖关系。Mybatis-Spring模块提供了一个桥接,使得Spring能够管理和初始化Mybatis的SqlSessionFactory和SqlSessionTemplate,这样就可以在Spring的环境下无缝地使用...

    Dependency injection in action

    13. SINGLETON (单例)、SCOPED (作用域)、TRANSIENT (瞬态):指的是在Spring等依赖注入容器中管理对象生命周期的不同模式。 14. AUTO-REGISTRATION (自动注册):依赖注入容器自动发现并注册bean。 15. OBJECT LIFE...

    jsf需要全部包

    - 通过注解(@ManagedBean, @RequestScoped, @SessionScoped等)来定义Bean的生命周期和范围。 5. **依赖注入**: - JSF支持依赖注入(Dependency Injection, DI),可以方便地在Bean之间共享对象。 - CDI...

    S2SH购物车+HibernateTemplate分页

    Spring作为核心容器,管理应用对象的生命周期和依赖关系,通过IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)来解耦组件。在本项目中,Spring管理SessionFactory、...

    1st_app_Analysis:测试认证CDI

    这个技术主要应用于企业级Java应用,特别是Java EE环境中,它提供了一种管理对象(如服务、DAO等)以及它们之间依赖关系的方式。CDI的核心理念是解耦组件,提高代码的可测试性,通过容器来管理对象的生命周期和依赖...

    JSF2.0+Spring+Hibernate实例代码

    例如,通过Spring的`@ManagedBean`和`@RequestScoped`注解可以创建JSF可访问的bean,同时利用Spring的IoC容器管理这些bean的生命周期和依赖关系。 **Hibernate**是一个流行的Java ORM(对象关系映射)框架,它允许...

    struts2.3.8+spring3.2.1+hibernate4.2.0整合

    Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自负责Web应用程序的不同层面:Struts2专注于表现层管理,Spring提供了强大的依赖注入和事务管理,而Hibernate则是持久层的解决方案,负责数据库操作...

    jetty-openwebbeans-cdi-demo:使用apache openwebbeans作为CDI实现在码头上运行的Web应用程序

    5. **Java源代码**:Java源代码中会包含CDI注解,如`@Inject`、`@Named`、`@RequestScoped`等,用来声明依赖关系和定义bean的作用域。 6. **测试**:项目可能包含JUnit测试,用于验证CDI bean的正确行为和依赖注入...

Global site tag (gtag.js) - Google Analytics