Usando @Autowired nas classes abstratas

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.