0
我有一個bean,定義爲scope="session"
,並通過<aop:scoped-proxy/>
創建,但是,當我訪問這樣的作用域CGLIB代理時,它甚至在會話之外工作,這是錯誤的。我已經嘗試了自動裝配代理或直接從應用程序上下文獲取它,但是,每次甚至在完全不是任何請求會話的一部分的新線程中,我都會從代理獲取實際值,而不是代理null
或代理投擲例外。會話作用域bean工作在會話線程之外
這裏是例子bean定義
<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
prototype
作用域,而不是自動裝配它,我每次從應用程序上下文中實例化它,但沒有區別。它將得到與自動裝配的「單獨」作用域版本相同的CGLIB代理。