Que fait spring-boot-dependency-injection ?
Fournit des schémas d'injection de dépendances pour les projets Spring Boot, incluant la conception avec constructeurs en premier, la gestion des collaborateurs optionnels, la sélection de beans et la validation du câblage. À utiliser lors de la création de services et de configurations, pour remplacer l'injection par champ, ou pour résoudre des problèmes de câblage Spring ambigu ou fragile.
Aperçu
Cette compétence vous aide à implémenter les meilleures pratiques d'injection de dépendances dans Spring Boot. Elle se concentre sur l'utilisation de l'injection par constructeur comme approche principale, tout en fournissant des solutions pour les cas spéciaux comme les dépendances optionnelles, la sélection explicite de beans et la validation du câblage de l'application.
Schémas clés
1. Injection par constructeur (Constructeur en premier)
Utilisez l'injection par constructeur plutôt que l'injection par champ (@Autowired sur le champ) pour améliorer l'immuabilité, la testabilité et la clarté.
@Service
public class UserService {
private final UserRepository userRepository;
private final EmailService emailService;
// L'injection par constructeur est la méthode privilégiée
public UserService(UserRepository userRepository, EmailService emailService) {
this.userRepository = userRepository;
this.emailService = emailService;
}
}
2. Dépendances optionnelles
Utilisez java.util.Optional avec @Autowired ou le constructeur pour des dépendances optionnelles.
@Service
public class ReportService {
private final Optional<ReportGenerator> reportGenerator;
public ReportService(Optional<ReportGenerator> reportGenerator) {
this.reportGenerator = reportGenerator;
}
public void generateReport() {
reportGenerator.ifPresentOrElse(
ReportGenerator::generate,
() -> System.out.println("Aucun générateur de rapport trouvé")
);
}
}
3. Sélection de beans avec @Qualifier
Utilisez @Qualifier pour choisir un bean spécifique lorsque plusieurs beans du même type existent.
@Configuration
public class AppConfig {
@Bean
@Qualifier("primary")
public DataSource primaryDataSource() {
return new DataSource("jdbc:primary");
}
@Bean
@Qualifier("secondary")
public DataSource secondaryDataSource() {
return new DataSource("jdbc:secondary");
}
}
@Service
public class DatabaseService {
private final DataSource dataSource;
public DatabaseService(@Qualifier("primary") DataSource dataSource) {
this.dataSource = dataSource;
}
}
4. Validation du câblage avec @Autowired(required = false)
Pour des dépendances vraiment optionnelles, vous pouvez utiliser @Autowired(required = false) sur des propriétés ou des méthodes setter.
@Component
public class LegacyService {
@Autowired(required = false)
private SomeOptionalComponent component;
public void execute() {
if (component != null) {
component.performAction();
}
}
}
Dépannage
Symptômes et solutions
| Symptôme | Cause probable | Solution |
|---|---|---|
NoSuchBeanDefinitionException | Bean manquant | Vérifiez que le bean est déclaré (via @Component, @Bean, etc.) |
UnsatisfiedDependencyException | Ambiguïté : plusieurs beans correspondent | Utilisez @Qualifier ou @Primary pour lever l'ambiguïté |
Dépendance nulle malgré @Autowired | Champ non géré par Spring | Assurez-vous que la classe est gérée par Spring (par exemple, annotée avec @Service) |
BeanCreationException | Erreur lors de la création du bean | Vérifiez les dépendances cycliques ou les configurations manquantes |
Commandes utiles
# Activer les logs de diagnostic de Spring pour l'injection de dépendances
# Ajouter dans application.properties ou application.yml:
# logging.level.org.springframework.beans.factory=DEBUG