怎么理解?

发布于 2022-09-02 16:12:21 字数 2114 浏览 15 评论 0

首先看一下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自然也不能再使用。网上有人解释说,这个代理只随着session的创建而创建,销毁而销毁。

<aop:scoped-proxy/>到底如何使用啊?求大神指导。

项目中代码如下:

<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;
    }
}

这段代码是什么意思啊?求解释。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

面如桃花 2022-09-09 16:12:21

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

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

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

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

衣神在巴黎 2022-09-09 16:12:21

第二个例子中,userManager注入的是userPreferences的代理对象,当调用这个代理对象的方法时,会自动从httpsession中获取对应的userPreferences对象并调用其方法,从而实现在长生命周期对象里注入短生命周期的对象

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文