2016-11-22 45 views
5

Po wstrzyknięciu żadnych usług, mam dwie możliwości:Konstruktor wtrysku vs zastrzyku polowego

(pole wtrysk)

@Inject 
    private MyService myService; 

lub (Konstruktor wtrysku)

private MyService myService; 

@Inject 
public ClassWhereIWantToInject(MyService mySerivce){ 
    this.myService = myService; 
} 

Dlaczego wtrysk konstruktor jest lepszy niż złożony zastrzyk?

+0

Jaki jest opis sonaru dla tego błędu? – Chris311

+2

Zobacz powiązany opis reguły ([ten] (https://sonarqube.com/coding_rules#rule_key=squid%3AS3306)). Proponuję, abyś zaktualizował swoje pytanie pytaniami dotyczącymi tego rzeczywistego opisu, jeśli coś pozostanie niejasne. –

+0

Wielkie dzięki za @Nicolas – Riadh

Odpowiedz

1

zrobić coś takiego (zakładam używasz wiosna-boot albo coś porównywalnego dla CDI)

public class ClassWhereIWantToInject{ 

    private MyService myService; 

    @Inject 
    public ClassWhereIWantToInject(MyService mySerivce){ 
     this.myService = myService; 
    } 
} 

Na tym powiązanej question istnieją ważne argumenty, dlaczego używają zastrzyk przez konstruktora zamiast zastrzyku przez pola . Sprowadza się to do korzyści polegającej na tym, że można inicjować za pomocą konstruktora również w środowisku innym niż CDI, tj. Unit Test, bez potrzeby dodawania bardziej złożonej logiki.

+1

Używam EJB-CDI. Pytanie, który najlepiej nadaje się do zastrzyku: Field czy Constructor? Odpowiedź brzmi [tutaj] (https://sonarqube.com/coding_rules#rule_key=squid%3AS3306) – Riadh

+1

Haha, wspaniale powinienem spojrzeć na komentarze na twoje pytanie przed wpisaniem. Myślałem, że chcesz uniknąć ostrzeżenia, dlatego dodałem fragment kodu. – hecko84

0

Odpowiedź jest here

wtrysk Pole zostanie przeprowadzone prawidłowo, jeśli klasa, która zawiera tę wstrzykuje będą wstrzykiwać przez ramy (wiosna/EJB/CDI), w przeciwnym razie (klasa zostanie instancja przez rozmówcę za pomocą nowy operator) to naprawdę wyjątek NullPointerException, który czeka na realizację. W takim przypadku lepiej jest użyć wtrysku konstruktora.

Możemy wykonać niezawodny wtrysk polowy, gdy wtrysk zostanie wykonany w klasie wtryskiwanej przez ramę.