2

SpringでのJpaRepositoryの使用法について概念的なOOの質問があります。JpaRepositoryを呼び出し元に公開して、そのインスタンスでCRUDメソッドを呼び出せるようにするだけでいいですか、それとも各メソッドをラップして、サービス内から対応するJpaRepositoryメソッドのみを呼び出す必要がありますか?

コード内:

public interface MyJpa extends JpaRepository<MyEntity, Long>

それから:

@Repository
public class MyDbService{

    @Autowired
    private MyJpa myJpa;

    public Iterable<MyEntity> findAll()
    {
        return myJpa.findAll()
    }

    ... other CRUD methods

}

次に、クライアントは次のことを行います。

Iterable<MyEntity> entities = myDbService.findAll();

とは対照的に:

@Repository
public class MyDbService{

    @Autowired
    private MyJpa myJpa;

    public MyJpa getJpa() {
        return myJpa 
    };
}

次に、クライアントは次のことを行います。

Iterable<MyEntity> entities = myDbService.getJpa().findAll();

2番目のアプローチを使用しないことの主な懸念事項は何ですか?

4

2 に答える 2

4

私は後者のアプローチを好みます。私が取り組んでいるアプリケーションでは、通常、次のレイヤーがあります(レイヤーが多かれ少なかれある場合があります。これは非常に大まかなガイドラインです)。

レイヤー1-クライアントレイヤー

おそらく、SpringMVC@Controllerまたは@Service。例えば:

@Controller
public class MyController {
  @Autowired private MyManager myManager; // see Layer 2
}

レイヤー2-ビジネスレイヤー

レイヤー2は、クライアントレイヤーとDAOを分離します。これは通常、1つ以上のDAOを超えるファサードです。ここにビジネスロジック/ルールを配置したり、委任したり、別のレイヤーを追加したりできます。例えば:

@Component
public class MyManagerImpl implements MyManager {
  @Autowired private MyDao myDao; // see layer 3
}

レイヤー3-DAOレイヤー

レイヤー3はDAOまたは@Repositoryクラスです。あなたの例のように:

public interface MyDao extends JpaRepository<MyEntity, Long> {
  // Spring Data JPA magic here!
}

いくつかの一般的なアドバイス:

  • 厳密なルールはなく、アプリケーションごとに異なります。アプリケーションの要件に照らして、自分にとって意味のあることを実行します
  • 各レイヤーには1つの責任のみが必要です。複数の責任(データアクセスとクライアントAPIなど)を持つレイヤーを見つけた場合は、2つに分割する方がよい場合があります

最後に、私があなたの例で行う小さな変更の1つは、ではなく注釈MyDbServiceを付けることです。DAOのみに制限する必要があります。@Component@Repository@Repository

とりとめのないことが理にかなっていることを願っています!

于 2012-12-09T23:42:36.347 に答える
2

あなたの場合、中間層は廃止されています。依存関係(とにかくアンチパターン)を再公開するだけの場合、または依存関係に委任する以外のことをしていることに気付いた場合は、依存関係をクライアントに注入するだけです。たとえば、SpringMVCコントローラーなどのリポジトリーを使用しても大丈夫だと思います。

ただし、考慮すべきことが2つあります。

  1. 通常、拡張はお勧めしません。JPAJpaRepository固有のメソッドを公開し、クライアントは基盤となる永続化テクノロジーを実際に認識してはならないためです。したがってCrudRepositoryPagingAndSortingRepositoryなどを使用してください。

  2. 複数の呼び出しを調整する必要があり、したがっておそらくより広いトランザクション境界を区切る必要がある場合は、必ず中間層を使用してくださいまたは、クライアントがリポジトリを直接使用することを避けたい場合は、リポジトリをパッケージで保護し、サービス内のより高いレベルのメソッドにします。これにより、追加のビジネス機能(パスワードエンコーディングなど)が実行される可能性があります。

于 2012-12-10T18:51:14.717 に答える