web-dev-qa-db-fra.com

Injection à ressort sans annotation automatique

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?

9
kuba44

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é.

9

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.

7
Alex Saunin