Uso a injeção de dependência na primavera há algum tempo e compreendo como funciona e quais são os prós e os contras de usá-la. No entanto, quando estou criando uma nova classe, eu sempre me pergunto - essa classe deve ser gerenciada pelo Spring IOC Container?
E não quero falar sobre diferenças entre anotação @Autowired, configuração XML, injeção de setter, injeção de construtor, etc. Minha pergunta é geral.
Digamos que temos um serviço com um conversor:
@Service
public class Service {
@Autowired
private Repository repository;
@Autowired
private Converter converter;
public List<CarDto> getAllCars() {
List<Car> cars = repository.findAll();
return converter.mapToDto(cars);
}
}
@Component
public class Converter {
public CarDto mapToDto(List<Car> cars) {
return new ArrayList<CarDto>(); // do the mapping here
}
}
Claramente, o conversor não possui dependências, portanto, não é necessário que ele seja conectado automaticamente. Mas, para mim, parece melhor como conectado automaticamente. O código é mais limpo e fácil de testar. Se eu escrever esse código sem DI, o serviço será semelhante a:
@Service
public class Service {
@Autowired
private Repository repository;
public List<CarDto> getAllCars() {
List<Car> cars = repository.findAll();
Converter converter = new Converter();
return converter.mapToDto(cars);
}
}
Agora é muito mais difícil testá-lo. Além disso, um novo conversor será criado para cada operação de conversão, mesmo que esteja sempre no mesmo estado, o que parece uma sobrecarga.
Existem alguns padrões bem conhecidos no Spring MVC: Controladores usando Serviços e Serviços usando Repositórios. Então, se o Repositório estiver conectado automaticamente (o que geralmente é), o Serviço também deverá ser conectado automaticamente. E isso é bem claro. Mas quando usamos a anotação @Component? Se você tem algumas classes utilitárias estáticas (como conversores, mapeadores) - você as utiliza automaticamente?
Você tenta fazer com que todas as classes sejam conectadas automaticamente? Todas as dependências de classe são fáceis de injetar (mais uma vez, fáceis de entender e fáceis de testar). Ou você tenta se conectar automaticamente apenas quando é absolutamente necessário?
Passei algum tempo procurando algumas regras gerais sobre quando usar a fiação automática, mas não consegui encontrar dicas específicas. Geralmente, as pessoas falam sobre "você usa DI? (Sim / não)" ou "que tipo de injeção de dependência você prefere", o que não responde à minha pergunta.
Ficaria muito grato por qualquer dica sobre esse tópico!