我有一个用scope="session"
定义并通过<aop:scoped-proxy/>
创建的bean,但是,当我访问这样的作用域CGLIB代理时,它甚至可以在会话之外工作,这是错误的。我已尝试将代理自动装入或直接从应用程序上下文中获取代理,但是,每次甚至在从未成为任何请求的会话的一部分的全新线程中,我从代理而不是代理{{1}获得实际值或代理抛出异常。
这是示例bean定义
null
以下是我如何使用它:
<bean id="commons" class="foo.bar.Commons" scope="session">
<aop:scoped-proxy/>
<property name="securityEnabled" value="true"/>
<property name="modificationAllowed" value="true"/>
<property name="autoSave" value="true"/>
</bean>
然而,即使在全新的线程中,public class CommonsModificatorProvider implements ModificatorProvider, ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public String getCurrentModificator() {
try {
Commons commons = applicationContext.getBean(Commons.class);
if (commons == null)
return "system";
String user = commons.getCurrentUser();
if (user == null)
return "system";
return user;
} catch (Exception e) {
return "system";
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
也总是返回一些值。
我尝试过getCurrentUser()
CommonsModificationProvider
作用域,而不是自动装配它,我每次都从适当的应用程序上下文实例化它,但没有区别。它将获得与自动装配的'singleton'范围版本相同的CGLIB代理。
答案 0 :(得分:0)
好吧,显然春天正试图提供帮助并保存会话,如果你在一个会话中启动线程(虽然这远远可以超出我)。
要修复,您必须在新主题中调用channels
。