31

どちらが正しいですか?

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

4

2 に答える 2

56

Javadoc for Autowiredによると、アノテーションは「コンストラクター、フィールド、セッター・メソッド、または構成メソッド」で使用できます。詳細については、完全なドキュメントを参照してください。

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

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

于 2010-09-19T17:02:06.057 に答える
0

注釈はプロパティに付随します。これは、それが自動配線されているためです。自動的に設定されるプロパティ。 このチュートリアルには良い例があります。 このより高度な例は、修飾子を使用して配線を明確にする方法を示しています。

于 2010-09-19T17:01:31.623 に答える