Spring serviceの構築 パーマリンク to " Spring serviceの構築"
はじめに パーマリンク to "はじめに"
注意:このサブジェネレータは、完全なCRUDエンティティを作成するエンティティサブジェネレータよりもはるかに単純です。
このサブジェネレータはSpringのサービスbeanを生成します。このBeanは、アプリケーションのビジネス・ロジックがコーディングされる場所です。
“Bar”サービスbeanを生成するには、次のコマンドを実行します。
jhipster spring-service Bar
これは”BarService”を生成します:コードの行は非常に少ないですが、これについて通常多くの質問が来ています。私たちは以下の最も一般的な質問に答えていきます。
サービスクラスが「エンティティ」ジェネレータによって生成されないのはなぜですか? パーマリンク to "サービスクラスが「エンティティ」ジェネレータによって生成されないのはなぜですか?"
ここでは、2つの主要なアーキテクチャ原則があります。
- 無用なサービスの作成を促進するつもりはありません。必要なのがデータベース上の基本的なCRUDだけであれば、サービスbeanは必要ありません。そのため、デフォルトでは、JHipsterはそれらを生成しません。
- 私たちは、サービスbeanはリポジトリよりも粒度が粗いと考えています。サービスbeanは、複数のリポジトリを使用して、それらの上にビジネス価値を提供します。そのため、サービスbeanはエンティティでは生成できません。
サービスbeanでインタフェースを使用する必要がありますか? パーマリンク to "サービスbeanでインタフェースを使用する必要がありますか?"
簡単な回答: いいえ
長い回答が必要な場合は、次のようにします。
Springを使用する主な目的の1つはAOPです。これは、Springがbeanの上に新しい動作を追加できるようにするテクノロジーです。たとえば、トランザクションやセキュリティを動作させます。
これらの動作を追加するには、Springはクラスにプロキシを作成する必要があり、プロキシを作成するには2つの方法があります。
- クラスがインタフェースを使用する場合、SpringはJavaが提供する標準メカニズムを使用して動的プロキシーを作成します。
- クラスがインタフェースを使用しない場合、SpringはCGLIBを使用して即時に新しいクラスを生成します。これは標準のJavaメカニズムではありませんが、標準のメカニズムと同様に機能します。
インタフェースの方がテストを記述するのに適していると主張する人もいますが、私たちはテスト用のプロダクションコードを変更すべきではないと考えており、新しいモックフレームワーク(EasyMockなど)を使用すると、すべてにおいてインタフェースなしで非常に優れたユニットテストを作成できます。
結局のところ、サービスbeanのインタフェースはほとんど役に立たないので、お勧めしません(ただし、インタフェースを生成するオプションは残されています)。
遅延JPAリレーションシップをフェッチするためにトランザクションを使用する必要があるのはなぜですか? パーマリンク to "遅延JPAリレーションシップをフェッチするためにトランザクションを使用する必要があるのはなぜですか?"
デフォルトでは、JPAは1対多および多対多のエンティティリレーションシップの遅延初期化を使用します。このデフォルト設定を使用すると、おそらく恐ろしいLazyInitializationException
が表示されます。これは、トランザクションの外部で初期化されていないリレーションシップを使用しようとしたことを意味します。
生成されたServiceクラスはデフォルトで@Transactional
アノテーションを持つため、そのメソッドはすべてトランザクションです。これは、LazyInitializationException
なしで、これらのビジネスメソッド内で必要なすべての遅延リレーションシップをフェッチできることを意味します。
ヒント: データを変更しない場合は、メソッドに対して@Transactional(readOnly=true)
を使用してください。これは、優れたパフォーマンスの最適化です(何も変更しないので、Hibernateは1レベルのキャッシュをFlashする必要がありません)。また一部のJDBCドライバによる品質の向上でもあります(OracleではINSERT/UPDATE/DELETE文を送信できません)。
サービスbeansにセキュリティを追加できますか? パーマリンク to "サービスbeansにセキュリティを追加できますか?"
はい! クラスまたはメソッドにSpring Securityの@Secured
アノテーションを追加し、生成されたAuthoritiesConstants
クラスを使用して特定のユーザー権限へのアクセスを制限します。