33 Stimmen

Wo soll die @Autowired-Anmerkung angebracht werden - bei der Eigenschaft oder der Methode?

Was ist richtiger?

Dies (mit der @Autowired-Annotation der Methode)?

@Controller
public class MyController
{
    private MyDao myDao;

    @Autowired
    public MyController(MyDao myDao)
    {
        this.myDao = myDao;
    }

Dies (mit der @Autowired-Anmerkung auf der Eigenschaft)?

@Controller
public class MyController
{
    @Autowired
    private MyDao myDao;

    public MyController(MyDao myDao)
    {
        this.myDao = myDao;
    }

Wo soll die @Autowired-Anmerkung hin?

60voto

NamshubWriter Punkte 22785

Según die Javadoc für Autowired kann die Anmerkung für "einen Konstruktor, ein Feld, eine Setter-Methode oder eine Konfigurationsmethode" verwendet werden. Siehe die vollständige Dokumentation für weitere Einzelheiten.

Ich persönlich bevorzuge Ihre erste Option (Konstruktorinjektion), weil die myDao Feld als endgültig markiert werden kann:

@Controller
public class MyControllear {
    private final MyDao myDao;

    @Autowired
    public MyController(MyDao myDao) {
      this.myDao = myDao;
    }

Die Konstruktorinjektion ermöglicht es Ihnen auch, die Klasse in einem Einheitstest zu testen, ohne dass der Code von Spring abhängt.

Die zweite Option würde besser lauten:

@Controller
public class MyControllear {
    @Autowired
    private MyDao myDao;

    MyController() {
    }

Bei der Feldinjektion erstellt Spring das Objekt und aktualisiert dann die für die Injektion markierten Felder.

Eine Option, die Sie nicht erwähnt haben, ist das Anbringen von @Autowired auf eine Setter-Methode (Setter-Injektion):

@Controller
public class MyControllear {
    private MyDao myDao;

    MyController() {
    }

    @Autowired
    public void setMyDao(MyDao myDao) {
      this.myDao = myDao;
    }

Sie müssen sich nicht für das eine oder das andere entscheiden. Sie können Feldinjektion für einige Abhängigkeiten und Konstruktorinjektion für andere Abhängigkeiten desselben Objekts verwenden.

0voto

dj_segfault Punkte 11661

Die Anmerkung gehört zur Eigenschaft, denn das ist die Eigenschaft, die automatisch festgelegt werden soll. Dieses Lernprogramm hat ein schönes Beispiel. Dieses fortgeschrittenere Beispiel zeigt, wie man Qualifizierer verwendet, um die Verdrahtung zu disambiguieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X