2017-02-02 3 views

答えて

3

コンポーネントは、すべての必須の参照が存在すると有効になります。特定の時間に複数のコンポーネントを有効にすることができれば、シーケンスの保証はありません。

+0

遅延コンポーネントの場合、誰かがコンポーネントインスタンスを実際に要求したときにのみ、activateが呼び出されます。 –

2

バンドルの開始レベルが異なる場合、より低い開始レベルのバンドルのすべてのアクティベーションメソッドが、より高い開始レベルのバンドルのアクティベーションメソッドの前に実行されます。

このロジックを使用すると、起動方法シーケンスを制御したり、ログに基づいて何が起きたかを判断できます。

実際には、バンドルは開始レベルではなく依存関係によって注文する必要があります。

+0

あなたの答えはありがたいですが、私の質問は単一バンドル内のコンポーネント内のメソッドをアクティブにすることです。 –

+0

AFAIK、フレームワークは、標準のJavaリフレクションAPIを使用して、@Activate属性を持つクラスのメソッドをクエリします。サービスの依存関係を定義できますが、これがなければほとんどのクラスとそのアクティベータメソッドはソート順に従わないため、ソートされていない順不同で列挙されます。そのように、あなたの質問への答えは、起動メソッドへの呼び出しの順序は未定義です。 –

1

クリスチャンが言ったように、これはは定義されていませんです。依存関係が満たされると、OSGIはそのサービスをアクティブにします。

2番目の点として、サービスは起動シーケンスに依存してはいけません。彼らがそれをするなら、それは悪い習慣です。これはあなたのプロジェクトに関連するのはなぜですか?おそらく、私たちがあなたの設計を手助けすることができます。

1

他の人が指摘しているように、これは定義されていません。

しかし、時には、起動中に所定の順序でいくつかのメソッドを呼び出す理由があるとも言われています。あなたの場合は、常に他のすべてを呼び出す単一の "アクティブ化"メソッドを持つことができます。このようにして、あなたの用途に最適な注文ロジックを適用することができます。必要に応じて設定値も考慮に入れることができます。

関連する問題