Je trouve une réponse: https://stackoverflow.com/a/21218921/2754014 sur l'injection de dépendance. Il n'y a aucune annotation comme @Autowired
, @Inject
ou @Resource
. supposons qu'il n'y a pas de configuration XML pour cet exemple TwoInjectionStyles
bean (sauf simple <context:component-scan base-package="com.example" />
.
Est-il correct d'injecter sans spécifier d'annotation?
Depuis Spring 4.3, aucune annotation n'est requise pour l'injection de constructeur.
public class MovieRecommender {
private CustomerPreferenceDao customerPreferenceDao;
private MovieCatalog movieCatalog;
//@Autowired - no longer necessary
public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
@Autowired
public setMovieCatalog(MovieCatalog movieCatalog) {
this.movieCatalog = movieCatalog;
}
}
Mais vous avez toujours besoin de @Autowired
pour l'injection de setter. J'ai vérifié il y a un instant avec Spring Boot 1.5.7
(en utilisant Spring 4.3.11
) et quand j'ai supprimé @Autowired
alors le haricot n'a pas été injecté.
Oui, l'exemple est correct (à partir de la version Spring 4.3). Selon la documentation ( this for ex), si un bean a un seul constructeur , @Autowired
l'annotation peut être omise.
Mais il y a plusieurs nuances:
1. Lorsqu'un constructeur unique est présent et que setter est marqué par @Autowired
annotation, que l'injection du constructeur et du setter sera effectuée l'une après l'autre:
@Component
public class TwoInjectionStyles {
private Foo foo;
public TwoInjectionStyles(Foo f) {
this.foo = f; //Called firstly
}
@Autowired
public void setFoo(Foo f) {
this.foo = f; //Called secondly
}
}
2. Par contre, s'il n'y a pas de @Autowire
du tout (comme dans votre exemple ), que f
objet sera injecté une fois via le constructeur, et setter peut être utilisé de sa manière courante sans aucune injection.