1

2つの異なるサービスが実装しているインターフェースを作成しました。

インターフェイスの名前がCheckReferenceであり、CheckReferenceImpl1とCheckReferencImpl2の2つの異なるクラスがそれを実装していると考えてください。

@Component 
@Service(value = CheckReference.class) 
@Property(name = "domain", value = "ref1") 
public class CheckReferenceImpl1 implements CheckReference 

そしてもう一つ、

@Component 
@Service(value = CheckReference.class) 
@Property(name = "domain", value = "ref2") 
public class CheckReferenceImpl2 implements CheckReference 

次に、@ Referenceアノテーションを動的に使用して、必要に応じて実装を動的にロードします。だから、チェック状態で

public class LoadReference { 
    @Reference 
    CheckReference checkReference 

    if(check) { 
      // load checkReferencImpl1 
    } else { 
       // load checkReferenceImpl2 
    } 
} 

また、targetプロパティを使用して特定の実装をロードできることも知っています。しかし、それは静的な方法です。しかし、これを動的に行うには、仕様やチュートリアルから関連付けることができませんが、これをどのように行う必要がありますか?

4

2 に答える 2

0

ComponentContext.locateServiceを見ましたか?

于 2012-09-26T10:41:17.540 に答える
0

まず、SCR によって管理されるように を作成する必要がありますLoadReference(@Componentそうしない@Referenceと動作しません)。次に、構成管理サービスを使用して構成を提供する必要があります。この構成では、次の名前のプロパティを提供することで、参照のフィルターを提供できますREFERENCE_NAME.target

checkReference.target = FILTER_EXPRESSION

FILTER_EXPRESSIONOSGi フィルターで使用される標準の LDAP 式です。プロパティの伝播により、この構成プロパティはサービス コンポーネントに伝播され、 のターゲット サービスを選択するときに使用されcheckReferenceます。で条件をチェックするためのコードは必要ありませんLoadReference

于 2012-09-26T07:43:00.197 に答える