为了账号安全,请及时绑定邮箱和手机立即绑定

<aop:scoped-proxy/> 怎么理解?

<aop:scoped-proxy/> 怎么理解?

慕标5832272 2019-03-27 22:14:15
首先看一下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;    }}这段代码是什么意思啊?求解释。
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

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

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

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

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


查看完整回答
反对 回复 2019-04-19
  • 2 回答
  • 0 关注
  • 824 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信