web-dev-qa-db-ja.com

サービスインターフェイスのコードアーキテクチャとサービス実装クラスSpring

MVCパターンには、主に4つのクラスがあることがわかりました。コントローラ、サービス、サービスの実装とリポジトリ。

サービスはインターフェースであり、サービス実装はサービスクラスを実装し、すべての論理コードを含みます。構造は次のようになります:-

Serviceインターフェース

Service{

public void someMethod();

}

ServiceImplクラス

 ServiceImpl implements Service{
  public void someMethod(){
   //do something

   }    
 }

ただし、コントローラーからサービス実装コードにアクセスする場合は、サービスクラスのメソッドを次のように呼び出します。

@Autowired 
Service service;

Object obj =  service.someMethod();

コントローラはServiceImplクラスのコードをどのように実行しますか

14
viper

これは基本的にSpringの仕組みです:

サービス実装は、Spring Bean(@Componentまたは@Serviceアノテーションが必要、またはSpring XML構成ファイルで定義する必要がある)である必要があります。これにより、Springはそれを見つけて登録します。 Springアプリケーションコンテキスト。

次に、@Autowiredアノテーションを介して依存関係注入を使用し、サービスの実装をコントローラーに注入します。つまり、Springはコントローラーを調べ、serviceメンバー変数の@Autowiredアノテーションを見つけて、アプリケーションコンテキストで見つかったBeanで初期化します。以前に登録したサービス実装クラス。したがって、Springが完了すると、serviceServiceImplのインスタンスを参照します。

依存関係の注入がSpringでどのように機能するかについては、Spring Frameworkのリファレンスドキュメントを参照してください。 IoCコンテナー

12
Jesper

この種のアーキテクチャを持つ背後にある基本的な考え方は、春の大会とほとんど変わりません。

明日、両方のプロジェクトに単一のアプリケーションを使用したくないとし、webappの1つのデプロイメントとサービスの別のデプロイメントに入るとします。例UserService WebApp

そのため、WebAppがUserServiceに接続するには、あらゆる種類のデータを取得するためにhttpリクエストを行う必要があります。次に、すべてのWebAppコードを変更して、新しい変更に対応できるようにする必要があります。たとえば、サービスのメソッドを直接呼び出す代わりに、httpClientを呼び出します。このやり直しを回避するには、インターフェイスサービスを使用して独自のServiceImplを実装し、そこにすべてのhttpリクエストを作成します。残りはそのままです。

同様のことがUserServiceでも行われ、以前と同じように独自のServiceImplがありますが、コントローラーではシングルトンオブジェクトとして呼び出されます。

あなたの答え:ServiceImplを直接参照することができます、それは目的を果たします、違いはServiceImplが現在のモジュールまたは依存関係の一部ではない場合のみですが、最終的なバンドルされたプロジェクトはおそらく兄弟モジュールを通じて実装されます

3
LNT

アノテーション@ Autowiredを使用すると、Springはそのアプリケーションコンテキストで、コントローラーに注入される候補を自動的に検索します。有効な候補は、たとえば注釈@ Serviceを使用して、Spring Beanとしてマークされた具象クラスである必要があります。

1
gWombat

@Controller-Controllerは、ユーザーインターフェースからのリクエストを消費し、一連のサービスを定義し、どのリクエストがバックエンドに送信され、何を返すかを示すリクエストマッピングURIパスをダンプするエントリポイントです。次に、一連のインターフェイスを作成する一連のサービスを作成します。次に、一連のServiceImplementationファイルを作成してから、DAOを作成します。 Autowiredに関する注意:@Serviceで指定したインスタンスが自動的に提供されます-特定のクラスはDAOトランザクションの記述に使用されるサービスとして扱われます。 @Autowiredは、どこかから必要な「インスタンス」をもたらします。通常、Autowiredアノテーションから必要な「サービス」を見つけようとします。次に、@ qualifierを追加して、同様のBeanからどの特定のインスタンスを取得するかについての混乱を避けることができます。

0
surendrapanday