私は CQ5 を初めて使用します。OSGi の概念を調べているときに、サービスと呼ばれるものを見つけました。そのためのインターフェースと実装クラスを持つバンドルを作成しました。これはメソッドをオーバーライドします(単に文字列「hello world」を返します)。そのクラスをjsp /一部のJavaクラスで利用したい場合は、その新しいインスタンスを作成しますオブジェクトとそのメソッドを使用します。私の質問は、新しいオブジェクトを作成することとサービスを利用することの正確な違いは何ですか. また、新しいオブジェクトに対するサービスの利点についても言及してください。また、spring-DM を使用したサービスの構成を手伝ってください。
2 に答える
コンポーネントとサービスの主な違いは、そのライフサイクルが OSGi によって管理されていることです。つまり、それらの状態は、コンポーネントを使用するクラスから独立しています。
OSGi サービスには状態があり、情報を保存したりメッセージに応答したりするために使用でき、それらを使用するクラスのスコープを超えて存続します。また、実際の実装からインターフェイスを分離することもできます。実行中のインスタンスで特定のサービスの実装を簡単に交換できます (IE、プロバイダーを v1 から v1.0.1 にアップグレードします)。また、アプリケーションをシャットダウンせずにコンポーネントを一時的に停止したい場合もあります。サービスが有効化されると、サービスは再び配線されます。
それらのそれぞれの基本的な使用例は、それらの機能に関するものです。クラスが、いくつかのゲッターとセッターを持つ単なる Bean である場合、おそらくそれをインスタンス化し、埋めて、必要なときにいつでも使用します。一方、クラスが何らかの機能 (処理、保存、キューイングなど) を提供する場合。それはおそらくサービスであるべきです。多くの静的メソッド (ヘルパー、マネージャー) を持つクラスは、通常、サービスとして非常に簡単にリファクタリングできます。
spring-dm については不明です。しかし、Adobe CQ5 では、通常、Declarative ServicesにFelix アノテーションを使用します。
@santiagozky による優れた回答に加えて、もう 1 つの大きな違いは依存関係の管理であることを付け加えておきます。
オブジェクトをインスタンス化すると、その依存関係がすべて継承されます。これらの依存関係を変更する可能性のある実装の変更に永遠に縛られています。サービスを利用するときは、インターフェイスへのコーディングに関する Java のベスト プラクティスに従っていることになります。コードは実装に依存せず、インターフェースの依存関係のみに依存します。これは常に実装と同じかそれ以下になります。通常、はるかに小さな依存関係のセットです。既存の実装を変更したり、実装を完全に変更したりしても、コードには影響しません。