system-sekkei/isolating-the-domain

@Autowiredは使わない方針でしょうか?

Closed this issue · 3 comments

いつも参考にさせてもらっています。

SpringBootのサンプルなどを見ると@Autowiredを使っているのが多いですが、isolating-the-domainでは使っていません。

何か特別な理由があるのでしょうか?

@SpaceNet

@Autowired のアノテーションは明示的に記述していません。暗黙的にコンストラクタでインジェクションしてくれるSpringに仕組みを使っています。
@controller, @service, @repository でアノテーションしているクラスは、ほとんどがこの仕組みを使っています)

コンストラクタに、@Autowired を記述する、という選択肢はありますね。

横から失礼します

SpringBootのサンプルなどを見ると@Autowiredを使っているのが多いですが

コンストラクが一つの場合に@Autowiredを省略できるようになったのが、Spring Framework 4.3、Spring Boot 1.4からのなので、それを知らないか名残で@Autowiredを使い続けている例があるのだと思います。

そもそもコンストラクタインジェクションとフィールドインジェクションとセッターインジェクションどれがいいかについては、フィールドをfinalにできる点でコンストラクタインジェクションが良いです。
これはSpringのドキュメントにも書かれています。

https://docs.spring.io/spring/docs/5.1.5.RELEASE/spring-framework-reference/core.html#beans-constructor-vs-setter-injection

The Spring team generally advocates constructor injection, as it lets you implement application components as immutable objects and ensures that required dependencies are not null.

コンストラクタインジェクションの@Autowiredが省略できるようになる前は、フィールドインジェクションの方が、記述量が少なくなることが多いためか使われることが多かったですが、Spring 4.3から明確にコンストラクタインジェクションの方が楽になったし、finalにもできるので、現時点でコンストラクタインジェクション+@Autowiredなしを選ばない理由はないと思います。

@making

ありがとうございます。
こういうきちんとした説明はとてもありがたいです。