どちらが正しいですか?
これ(メソッドに@Autowiredアノテーションが付いている)?
@Controller
public class MyController
{
private MyDao myDao;
@Autowired
public MyController(MyDao myDao)
{
this.myDao = myDao;
}
これ(プロパティに@Autowiredアノテーションが付いている)?
@Controller
public class MyController
{
@Autowired
private MyDao myDao;
public MyController(MyDao myDao)
{
this.myDao = myDao;
}
@Autowiredアノテーションはどこに行くことになっていますか?
AutowiredのJavadoc によると、注釈は「コンストラクター、フィールド、セッターメソッドまたは構成メソッド」で使用できます。詳細は 完全なドキュメント を参照してください。
myDao
フィールドをfinalとしてマークできるため、個人的には最初のオプション(コンストラクターインジェクション)を好みます。
@Controller
public class MyControllear {
private final MyDao myDao;
@Autowired
public MyController(MyDao myDao) {
this.myDao = myDao;
}
コンストラクターインジェクションを使用すると、Springに依存するコードなしでユニットテストでクラスをテストすることもできます。
2番目のオプションは、次のように記述します。
@Controller
public class MyControllear {
@Autowired
private MyDao myDao;
MyController() {
}
フィールドインジェクションを使用すると、Springはオブジェクトを作成し、インジェクション用にマークされたフィールドを更新します。
言及しなかったオプションの1つは、@Autowired
セッターメソッド(セッターインジェクション):
@Controller
public class MyControllear {
private MyDao myDao;
MyController() {
}
@Autowired
public void setMyDao(MyDao myDao) {
this.myDao = myDao;
}
どちらかを選択する必要はありません。同じオブジェクトの一部の依存関係にはフィールドインジェクションを使用し、他の依存関係にはコンストラクタインジェクションを使用できます。