如何確保在調用activate()
之前注入所有依賴項?激活後OSGI聲明性服務注入
private IMyDependency aInstance, bInstance, cInstance;
public void setDependency(IMyDependency depInstance) {
Bundle depBundle = FrameworkUtil.getBundle(depInstance.getClass());
logger.debug("Dependency {} from bundle {} retrieved", depInstance, depBundle.getSymbolicName());
if (A_BUNDLE_NAME.equals(depBundle.getSymbolicName())) {
aInstance = depInstance;
} else if (B_BUNDLE_NAME.equals(depBundle.getSymbolicName())) {
bInstance = depInstance;
} else if (C_BUNDLE_NAME.equals(depBundle.getSymbolicName())) {
cInstance = depInstance;
} else {
logger.error("Dependency {} from unknown bundle {}", depInstance, depBundle);
}
}
public void activate() {
Preconditions.checkNotNull(aInstance);
Preconditions.checkNotNull(bInstance);
Preconditions.checkNotNull(cInstance);
//...
}
有IMyDependency的多個實例,並且依賴基數是0..n
。
問題是,setDependency()
有時在activate()
方法後調用。解決方法是更改從屬捆綁的開始級別,但我們確實不想觸摸配置。
只有在所有三種依賴關係都可用的情況下,纔想激活組件?爲什麼不在組件中創建三個單獨的引用? –
不完全。我希望框架能夠在所有依賴關係被注入後激活組件。組件中已經有三個單獨的引用。 – b10y
根據您的示例代碼,您需要三個單獨的STATIC參考和MANDATORY基數,而不是有一個0..n參考。根據他們來自哪個捆綁的事實連接OSGi服務是一種非常糟糕的做法。另外,請參閱Declarative Services新規範中的最小基數選項(我不知道這是否已在新的SCR項目中實現)。 「 –