OSGiサービスの使用
Liferay APIは、OSGiサービスとしてすぐに利用できます。 次のように、そのサービスタイプのフィールドを作成し、そのフィールドに @Reference アノテーションを付けることで、サービスにアクセスできます。
@Reference
BlogsEntryService _blogsEntryService;
上記の_blogsEntryServiceフィールドは、 BlogsEntryService OSGiサービスにアクセスします。
すべてのDeclarative Servicesコンポーネント( @Component でアノテーションが付けられたクラス)は、この方法でOSGiサービスにアクセスできます。 ランタイムフレームワークは、コンポーネントの@Referenceのアノテーションが付いたフィールドにサービスタイプを挿入します。
次の例は、Greeterと呼ばれるOSGiサービスの使用を示しています。 3つのモジュールは、OSGiサービスで使用される API-Provider-Consumer パターンを示しています。
- API モジュールは、
Greeterサービスタイプを定義します。 - 実装モジュールは
Greeterサービスを 提供 します。 - サンプルモジュールは
Greeterサービスを 消費 します。
サンプルモジュールクラスは、Greeterサービスを使用してパーソナライズされた挨拶を返すGogo シェルコマンドを作成します。 この例をOSGiサービスの「Hello World」と考えてください。

OSGiサービスは任意のJavaクラスで使用できます。
LiferayサービスのJavadocは こちら から入手できます。
OSGiサービスの作成方法については、 OSGiサービスとしてのAPI を参照してください。
Gogo シェルコマンドの例をデプロイする
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 。
http://localhost:8080でLiferayへのサインインします。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learn に変更します。
次に、以下の手順を実行します。
-
liferay-j1h1.zipをダウンロードして解凍する。curl https://resources.learn.liferay.com/dxp/latest/en/liferay-internals/fundamentals/liferay-j1h1.zip -Ounzip liferay-j1h1.zip -
サンプルモジュールをデプロイします。
cd liferay-j1h1./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq) -
Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.j1h1.api_1.0.0 STARTED com.acme.j1h1.impl_1.0.0 STARTED com.acme.j1h1.osgi.commands_1.0.0 -
Gogo シェルを開きます。
-
Gogo シェルコマンドフィールドに、
j1h1:greetコマンドを入力して、挨拶を生成します。j1h1:greet "Captain Kirk" -
出力を確認します。
Hello Captain Kirk!
この例のモジュールは、APIおよび実装モジュールを利用して、j1h1:greet Gogo シェルコマンドから返されるコンテンツを生成します。
OSGiサービスの使用方法
ビジネスロジックの作成
クラスでは、必要なOSGiサービスを使用してビジネスロジックを実装します。
- サービスをインポートします。
import com.acme.j1h1.Greeter;
- サービスを使用します。
public void greet(String name) {
_greeter.greet(name);
}
private Greeter _greeter;
上記のメソッドは、Greeterのgreetメソッドを呼び出します。 com.acme.j1h1.Greeterは、実装モジュールが登録するOSGiサービスタイプです。 クラスは、OSGiサービスレジストリからGreeterインスタンスを取得する必要があります。
外部サービスリファレンスの注釈
レジストリからOSGiサービスを取得するには、そのサービスタイプのフィールドに @Reference アノテーションを追加する必要があります。 @Referenceをサービスフィールドに追加します。
@Reference
private Greeter _greeter;
J1H1OSGiCommandsクラスには、_greeterと呼ばれる上記のプライベートGreeterフィールドがあります。 @Referenceアノテーションは、レジストリからのGreeterサービスをフィールドに挿入するようにOSGiランタイムに指示します。 J1H1Greeterがレジストリ内で最も一致するGreeterサービスコンポーネントである場合(この例ではこれが唯一の一致です)、ランタイムは_greeterにJ1H1Greeterを挿入します。
クラスをコンポーネントにする
@Referenceアノテーションを使用できるのは、Declarative Servicesコンポーネントのみです。 @Componentアノテーションをクラスに追加し、service属性を使用して、コンポーネントが特定のサービスを実装していることを宣言します。
@Component(
property = {"osgi.command.function=greet", "osgi.command.scope=j1h1"},
service = J1H1OSGiCommands.class
)
public class J1H1OSGiCommands {
J1H1OSGiCommandsクラスは、独自のタイプのOSGiサービスを提供します。 2つのプロパティは、j1h1というスコープでgreet というコマンド関数を使用してGogoシェルコマンドを定義します。 デプロイされたJ1H1OSGiCommandsコンポーネントは、Stringを入力として受け取るGogo シェルコマンドj1h1:greetを提供します。
APIへの依存関係を追加する
コンシューマモジュールはAPIに依存します。 build.gradleファイルで、依存関係にAPIを追加します。 j1h1-osgi-commandsモジュールのbuild.gradleファイルは次のとおりです。
dependencies {
compileOnly group: "com.liferay.portal", name: "release.portal.api"
compileOnly project(":j1h1-api")
}
release.portal.apiアーティファクトは、モジュールが現在のLiferay製品リリースから必要とするLiferay、Bnd、およびOSGiサービスを提供します。 [project root]/gradle.propertiesファイルのliferay.workspace.productは、リリースを指定します。
ローカルプロジェクトj1h1-apiはGreeterサービスを提供するため、j1h1-osgi-commandsはアーティファクトではなくプロジェクトとしてそのサービスに依存できます。 外部アーティファクトに依存関係を指定することも簡単です。
まとめ
APIモジュールとImplモジュールは、それぞれGreeterサービスを定義および提供しました。 例のj1h1-osgi-commandsモジュールは、サービスを使用して単純なGogo シェルコマンドを作成します。 API-Provider-Consumer契約によって疎結合が促進され、ソフトウェアの管理、拡張、およびサポートが容易になります。
隣接するプロジェクトからOSGiサービスを使用することに慣れてきたので、外部アーティファクトからOSGiサービスを使用することを検討してみましょう。 依存関係の構成 では、モジュールを見つけて依存関係として構成する方法を示しています。