web-dev-qa-db-ja.com

プロパティまたはメソッドの@Autowiredアノテーションはどこに行くべきですか?

どちらが正しいですか?

これ(メソッドに@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アノテーションはどこに行くことになっていますか?

31
Thom Wilkie

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;
    }

どちらかを選択する必要はありません。同じオブジェクトの一部の依存関係にはフィールドインジェクションを使用し、他の依存関係にはコンストラクタインジェクションを使用できます。

51
NamshubWriter

アノテーションはプロパティと連動します。なぜなら、それが自動配線されているからです。自動的に設定されるプロパティ。 このチュートリアル には良い例があります。 このより高度な例 は、修飾子を使用して配線を明確にする方法を示しています。

0
dj_segfault