autowired na polu klasy vs na setterze.

0

Czy jest jakas istotna różnica pomiedzy ponizszymi dwoma implementacjami?


@Controller
public class OwnerController {

	@Autowired
	private OwnerService ownerService;

.......

VS

@Controller
public class OwnerController {

	
	private OwnerService ownerService;

@Autowired
public void setOwnerService(OwnerService ownerService){
this.ownerService=ownerService;
}
.......

w tutorialach zawsze podawane są rozne sposoby wiązania ale raczej jako sposoby równorzędne, natomiast na blogach zawsze to wiazanie jest albo konstruktorem, albo setterem. Czy po prsotu trafilem na ludzi, ktorzy lubia to robic w taki sposob, czy jest coś jeszcze, bo wg mnie @Autowired na polu jest najkrótszym rozwiazaniem, wiec po co bawic sie w settery ??

0

Różnica jest. Jedno ma setter drugie nie.

Najlepsze mieć dodatkowo konstrutor:

@Controller
public class OwnerController {
 
    private OwnerService ownerService;

    @Autowired
    public OwnerController(OwnerService ownerService) {
        this.ownerService = ownerService;
    }

Wtedy jak chcesz w teście wsadzić mocka/zależność to nie musisz strzelać refleksją.

0

Z tego co przeczytałem, to wstrzyknięcie zależności przez konstruktor stosuję w przypadku gdy chcemy mieć "mocne wiązanie" miedzy klasami, a przez setter, gdy nie jest ono nam bezwarunkowo potrzebne. Jestem na etapie przerabiania książki, w której tak było to wytłumaczone, lecz jest to zależne również od programisty, gdyż jeden powie, że w przypadku "x" jest potrzebne mocne wiązanie , a drugi powie,że nie ma takiej konieczności.

0

Ja osobiście preferuje @Inject na polach bo dzięki temu nie zaśmiecamy kodu nieużywanymi przez nikogo konstruktorami i setterami. Niemniej najnowszy guidline niby sugeruje żeby tak nie robić bo "nie widać" zależności bez zerkania do klasy, ale moim zdaniem to jest idiotyczny argument.

0

@Shalom A czym w tym wypadku różni się @Inject od @Autowired? @Autowired też możesz dać na polu bez konstruktora i settera.

2

Autowired to adnotacja specyficzna dla Springa a Inject to część standardu Java CDI. Inject rozumie zarówno Spring jak i Guice czy Weld, a Autowired rozumie tylko Spring.

1 użytkowników online, w tym zalogowanych: 0, gości: 1