この演習では、ビジネスロジック層を作成します。 演習1で作成した永続化層の呼び出しや、トランザクション管理を行います。
01-spring5
com.example.serviceパッケージ
CustomerServiceインタフェースは、コントローラーから呼ばれる、ビジネスロジックのインタフェースです。 メソッドが2つ定義されていることを確認してください(変更不要)。
CustomerServiceImplクラスは、ビジネスロジックインタフェースの実装クラスです。
@Service
を付加して、ビジネスロジッククラスのBeanであることを示してください。
CustomerRepository
のBeanを、コンストラクタでDIします。下記のように、フィールドとコンストラクタを作成してください。
今回はコンストラクタはクラス内に1つのみですので、@Autowired
は不要です。
private final CustomerRepository customerRepository;
public CustomerServiceImpl(CustomerRepository customerRepository) {
this.customerRepository = customerRepository;
}
各メソッドをトランザクション管理下にするには、@Transactional
を付加します。
こうすると、メソッド開始直前にトランザクション開始処理が割り込まれます(AOP)。
findAll()
メソッドに@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
を付加してください。
readOnly = true
とすると、このメソッド内ではSELECT文しか発行できなくなります。
PlatformTransactionManager
実装によっては、readOnly = true
を無視するものがあります。その場合は、SELECT文以外も発行できてしまう可能性があります。
CustomerRepository
のfindAll()
を呼び出し、その戻り値をreturnしてください。
このfindAll()
は、Spring DataのCrudRepository
に定義されたメソッドです。
save()
メソッドに@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
を付加してください。
readOnly = false
とすると、INSERT文などの変更系SQLも実行できるようになります。
CustomerRepository
のsave()
メソッドを呼び出してください。
このsave()
メソッドは、Spring DataのCrudRepository
に定義されたメソッドです。
save()
メソッドの引数には、DBに追加するCustomer
インスタンスを指定してください。
ServiceConfigクラスは、ビジネスロジックやトランザクションに関するJava Configクラスです。
クラスに@Configuration
を付加してJava Configであることを示してください。
@Serviceクラスをコンポーネントスキャンするアノテーションを付加します。
クラスに@ComponentScan(basePackages = "com.example.service.impl")
を付加してください。
トランザクション管理を有効化します。
クラスに@EnableTransactionManagement
を付加してください。
実際にトランザクション管理を行うPlatformTransactionManager
のBeanを定義します。
メソッドに@Bean
を付加してください。
ServiceConfigTestクラスを実行してください。 テストがグリーンになれば成功です。レッドになった場合、ServiceConfigクラスの実装を見直してください。
CustomerServiceTestクラスを実行してください。 テストがグリーンになれば成功です。レッドになった場合、CustomerServiceImplクラスの実装を見直してください。
これで演習2は完成です。 次の演習はtodo-3.mdに書かれています。