会话范围的bean在会话线程之外工作

时间:2016-08-20 20:27:15

标签: java spring

我有一个用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代理。

1 个答案:

答案 0 :(得分:0)

好吧,显然春天正试图提供帮助并保存会话,如果你在一个会话中启动线程(虽然这远远可以超出我)。

要修复,您必须在新主题中调用channels