如果找到了解決辦法,這需要一個小動作工作。
首先我已經在我的項目創造了兩個新的接口:
public interface IDataProvider {
public void register(IDataObserver observer);
public void unregister(IDataObserver observer);
}
public interface IDataObserver {
public void update();
}
正如我實現我的豆子在兩個接口的第二步驟。
@Name(ApplicationBean.BEAN_NAME)
@Scope(ScopeType.APPLICATION)
public class ApplicationBean implements IDataProvider {
private Set<IDataObserver> observerList = new HashSet<IDataObserver>();
@Override
public void register(IDataObserver observer) {
this.observerList.add(observer);
}
@Override
public void unregister(IDataObserver observer) {
this.observerList.remove(observer);
}
public void notifyAllObserver() {
for(IDataObserver observer : observerList) {
observer.update();
}
}
}
@Name(SessionBean.BEAN_NAME)
@Scope(ScopeType.SESSION)
public class SessionBean implements IDataObserver {
@Create
public void init() {
// inject dependencies
injectBeans();
// register at the dataserviceprovider to be notified about data changes
dataProviderService.register(this);
}
private void injectBeans() {
dataProviderService = (DataProviderService) Component.getInstance(
DataProviderService.BEAN_NAME, ScopeType.APPLICATION);
}
@Destroy
public void shutDown() {
dataProviderService.unregister(this);
}
@Override
public void update() {
// grab data from
}
}
如果通過Component.getInstance()而不是通過@In注入Seam組件一起請注意,這種方法只適用。在後面的例子中,只要update()被調用,你將總是得到null!
你可以切換到JEE 6嗎?對於CDI bean來說這很容易(你可以放棄Seam,這被認爲是棄用CDI) –
不幸的是,這不是一個選項。 – Richard