Usando @Autowired nas classes abstratas
1. Introdução
Neste tutorial rápido, explicaremos como usar a anotação@Autowired emabstract classes.
Vamos aplicar@Autowired a uma classe abstrata e focar nos pontos importantes que devemos levar em consideração.
2. Injeção de Setter
Podemos usar@Autowired em um método setter:
public abstract class BallService {
private LogRepository logRepository;
@Autowired
public final void setLogRepository(LogRepository logRepository) {
this.logRepository = logRepository;
}
}
Quando usamos@Autowired em um método setter, devemos usarthe final keyword, so that the subclass can’t override the setter method. Caso contrário, a anotação não funcionará como esperamos.
3. Injeção de Construtor
Não podemos usar@Autowired em um construtor de uma classe abstrata.
O Spring não avalia a anotação@Autowired em um construtor de uma classe abstrata. A subclasse deve fornecer os argumentos necessários para o construtorsuper.
Em vez disso, devemos usar@Autowired no construtor da subclasse:
public abstract class BallService {
private RuleRepository ruleRepository;
public BallService(RuleRepository ruleRepository) {
this.ruleRepository = ruleRepository;
}
}
@Component
public class BasketballService extends BallService {
@Autowired
public BasketballService(RuleRepository ruleRepository) {
super(ruleRepository);
}
}
4. Folha de dicas
Vamos encerrar com algumas regras para lembrar.
Primeiro,an abstract class isn’t component-scanned, uma vez que não pode ser instanciado sem uma subclasse concreta.
Em segundo lugar,setter injection is possible in an abstract class, mas é arriscado se não usarmos a palavra-chavefinal para o método setter. O aplicativo pode não ser estável se uma subclasse substituir o método setter.
Terceiro, como o Spring não suporta injeção de construtor em uma classe abstrata,we should generally let the concrete subclasses provide the constructor arguments. Isso significa quewe need to rely on constructor injection in concrete subclasses.
E finalmente, usar injeção de construtor para dependências necessárias e injeção de setter para dependências opcionais éa good rule of thumb. No entanto, como podemos ver com algumas das nuances com classes abstratas,constructor injection is more favorable aqui em geral.
Então, realmente podemos dizer quea concrete subclass governs how its abstract parent gets its dependencies. A primavera fará a injeçãoas long as Spring wires up the subclass.
5. Conclusão
Neste artigo, praticamos o uso de@Autowired em uma classe abstrata e explicamos alguns pontos-chave importantes.
O código-fonte deste tutorial pode ser encontrado emthe Github project como de costume.