web-dev-qa-db-fra.com

Comment @Autowire services dans Spring Boot

Bonjour les gars. J'ai une question sur les services de câblage automatique dans mes cours lors de l'utilisation de Springboot. Tous les exemples que j'ai vus sur Internet ainsi que dans la spécification Springboot font quelque chose de similaire (en prenant un extrait de la spécification Springboot version 1.5.7):

package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;

@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}

Il s'agit d'une classe qui injecte une propriété via son constructeur, au moyen de @Autowiring le constructeur. Une autre forme consiste à @Autowire la propriété comme ceci:

@Autowired
private final RiskAssessor riskAssessor

Mais, là où je travaille, pour que ces deux méthodes fonctionnent, on m'a dit que je devais utiliser cette méthode:

 applicationContext.getAutowireCapableBeanFactory().autowireBean(Object.class)

Ils m'ont dit que j'en avais besoin pour que l'annotation @Autowired fonctionne.

Maintenant, ma question est la suivante: pourquoi n'y a-t-il pas d'annotation simple permettant au @Autowire de fonctionner correctement? (Quelque chose comme @AutowiredClass). La méthode ci-dessus est trop verbeuse et difficile à retenir, donc il doit sûrement y avoir une meilleure façon de faire travailler @Autowired sur les classes afin d'injecter des services, tout comme nous le faisons dans Grails où nous disons simplement def someService et il est automatiquement injecté.

6
Greg

Si vous souhaitez utiliser correctement @Autowired dans votre application Spring-Boot, vous devez effectuer les étapes suivantes:

  1. Ajouter @SpringBootApplicationà votre classe principale
  2. Ajouter @Service ou @Component annotation à la classe que vous souhaitez injecter
  3. Utilisez l'une des deux façons que vous décrivez en question, pour effectuer un câblage automatique
3
Pavlo Pastushok

Si vous n'avez pas de structure de package bizarre et que le package de classe principal inclut toutes les autres classes, vous voulez que spring instancie (directement ou dans les sous-packages) une annotation simple @ComponentScan sur votre classe principale vous aidera à enregistrer tous ces codes de plaque de chaudière. Le printemps fera alors la magie, il ira scanner le paquet (et les sous-paquets) et recherchera les classes annotées avec @Service, @Component etc et instanciez-le.

Encore mieux, utilisez @SpringBootApplication dans votre classe principale, cela couvrira @Configuration ainsi que. S'il s'agit d'un projet en champ vert, j'encourage à partir de start.spring.io - un outil de génération/échafaudage de modèles pour le printemps

2
Joanna

Maintenant, ma question est la suivante: pourquoi n'y a-t-il pas d'annotation simple permettant au @Autowire de fonctionner correctement?

Il y a: @SpringBootApplication

Si vous placez cela à la racine de votre application (fichier qui contient la classe principale) et tant que vos services sont dans le même package ou sous-package, Spring détectera automatiquement, instanciera et injectera les classes appropriées.

Il y a un exemple dans cette procédure: Service REST avec Spring Boot

Comme décrit dans cette page:

@SpringBootApplication est une annotation pratique qui ajoute tous les éléments suivants: @Configuration marque la classe comme source de définitions de bean pour le contexte de l'application. @EnableAutoConfiguration indique à Spring Boot de commencer à ajouter des beans en fonction des paramètres de chemin de classe, d'autres beans et de divers paramètres de propriété. @ComponentScan indique à Spring de rechercher d'autres composants, configurations et services dans le package hello, lui permettant de trouver les contrôleurs.

1
Cuga

Vous devez annoter l'implémentation de RestService en tant que @Service ou @Component so Spring le ramasserait.

@Service
public class MyRiskAssessorImpl implements RiskAssessor {
///
}
0
Zilvinas

@Autowired Fonctionne presque hors de la boîte. Faites simplement votre balayage des composants de la classe que vous souhaitez autowire et vous avez terminé. Assurez-vous simplement que votre classe principale (ou classe de configuration principale) utilise @ComponentScan("{com.example.app}") ou @SpringBootApplication (Classe principale). Les docs expliquent ce truc plutôt bien

0
Urosh T.