O que spring-boot-dependency-injection faz?
Fornece padrões de injeção de dependência para projetos Spring Boot, incluindo design baseado em construtor, tratamento de colaboradores opcionais, seleção de beans e validação de wiring. Use ao criar serviços e configurações, substituir injeção por campo ou solucionar problemas de wiring ambíguo ou frágil no Spring.
Padrões de Injeção de Dependência
1. Design Baseado em Construtor (Recomendado)
Sempre que possível, use injeção por construtor para dependências obrigatórias. Isso garante imutabilidade e facilita os testes.
@Service
public class UserService {
private final UserRepository userRepository;
private final NotificationService notificationService;
public UserService(UserRepository userRepository, NotificationService notificationService) {
this.userRepository = userRepository;
this.notificationService = notificationService;
}
}
2. Colaboradores Opcionais
Para dependências opcionais, use Optional ou @Autowired(required = false).
@Service
public class ReportService {
private final PdfGenerator pdfGenerator;
public ReportService(Optional<PdfGenerator> pdfGenerator) {
this.pdfGenerator = pdfGenerator.orElse(null);
}
}
3. Seleção de Beans
Use @Primary para beans padrão ou @Qualifier para selecionar beans específicos.
@Configuration
public class AppConfig {
@Bean
@Primary
public DataSource primaryDataSource() {
return new HikariDataSource();
}
@Bean
public DataSource secondaryDataSource() {
return new TomcatDataSource();
}
}
@Service
public class DataService {
private final DataSource dataSource;
public DataService(@Qualifier("secondaryDataSource") DataSource dataSource) {
this.dataSource = dataSource;
}
}
4. Validação de Wiring
Evite dependências frágeis usando validação explícita no construtor.
@Service
public class OrderService {
private final PaymentGateway paymentGateway;
public OrderService(PaymentGateway paymentGateway) {
Assert.notNull(paymentGateway, "PaymentGateway must not be null");
this.paymentGateway = paymentGateway;
}
}
Boas Práticas
- Prefira injeção por construtor em vez de injeção por campo.
- Use
finalpara dependências injetadas por construtor. - Evite
@Autowiredem campos para melhor testabilidade e clareza. - Documente dependências opcionais com
@NullableouOptional.
Solução de Problemas
Erro: "No qualifying bean of type"
- Verifique se a classe está anotada com
@Component,@Service,@Repositoryou@Bean. - Use
@Qualifierpara especificar o bean desejado. - Verifique se há múltiplos beans do mesmo tipo e ajuste com
@Primary.
Erro: "Field injection is not recommended"
Substitua a injeção por campo por injeção por construtor.
// Ruim
@Autowired
private UserRepository userRepository;
// Bom
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}