![](/img/trans.png)
[英]Differences between session beans and entity beans, and stateful session beans and stateless session beans
[英]Pass objects between stateless session beans
我有幾個無狀態和單例豆。
@Stateful
@Local(IMyService.class)
@LocalBean
public class MyService implements IMyService {
private @EJB Singleton1 singleton1;
private @EJB Singleton2 singleton2;
public void doSomeStuff() {
// construct shared object
singleton1.doOtherStuff();
singleton2.doOtherStuff();
}
}
@Singleton
@LocalBean
public class Singleton1 extends MySingleton {
@Override
public void doOtherStuff() {
// use shared object
}
}
@Singleton
@LocalBean
public class Singleton2 extends MySingleton {
@Override
public void doOtherStuff() {
// use shared object
}
}
public abstract class MySingleton {
public abstract void doOtherStuff();
}
現在,我希望在所有這些bean之間共享一個對象,而不必將其作為參數傳遞。
我本可以使用有狀態會話Bean,但是在無狀態Bean中注入有狀態Bean無效。
我沒有將其作為參數傳遞,因為我不想一直將其傳遞給方法,盡管僅在少數情況下才需要使用它。
是否有在客戶端會話中注入對象的方法,以便無論我身在何處都可以讀取它?
您可以將ContextHolder模式與ThreadLocal和Interceptor一起使用。
ThreadLocal —此類允許將變量存儲在線程作用域中。 我無意進入使用ThreadLocal的利弊。 我只是說它非常強大,必須非常小心地使用。
EJB攔截器 —用於攔截對bean實例的業務方法和生命周期事件的調用。
現在讓我們希望在所有這些bean之間共享一個用戶對象,而不必將其作為參數傳遞。
因此,我們的AuditContextHolder將是:
public class AuditContextHolder {
private static final ThreadLocal<String> AUDIT_CONTEXT = new ThreadLocal<>();
private AuditContextHolder() {
}
public static void put(String auditUser) {
AUDIT_CONTEXT.set(auditUser);
}
public static String get() {
return AUDIT_CONTEXT.get();
}
public static void cleanup() {
AUDIT_CONTEXT.remove();
}
}
審計攔截器將是這樣的:
public class AuditInterceptor {
@Resource
private SessionContext sessionContext;
@AroundInvoke
public Object inject(InvocationContext ctx) throws Exception {
String userName = sessionContext.getCallerPrincipal().toString();
try {
AuditContextHolder.put(userName);
return ctx.proceed();
} finally {
// very important
AuditContextHolder.cleanup();
}
}
}
現在,您可以在調用鏈中第一個無狀態會話Bean中使用@Interceptors(AuditInterceptor.class)
。 在調用鏈中的任何地方,您都可以通過調用AuditContextHolder.get()
獲得審核用戶。
參考文獻:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.