Autowired e a injeção de dependência do Spring
Injeção de dependências (Dependency Injection - DI) é um tipo de inversão de controle (Inversion of Control - IoC) que dá nome ao processo de prover instâncias de classes que um objeto precisa para funcionar. [Alexandre Afonso, 2017]
A Injeção de Dependência é uma técnica de desenvolvimento utilizada para evitar o alto nível de acoplamento de código (Quando os componentes de uma aplicação dependem muito uns dos outros) dentro de uma aplicação. Utilizando a injeção de dependências o framework fica responsável por “injetar” as dependências que iremos utilizar de um determinado componente declarado.
Como já explicado no post ‘Simplificando o que é o Spring’, a ideia central do Spring é baseada na injeção de dependências. Para injetar essa dependências no início do framework o programador necessitava de escrever as configurações que desejasse em XML. O que era pouco prático e nada produtivo na programação do dia a dia. Com isso surgiu as anotações no Spring. Além de aumentar a produtividade, as anotações também deixam as configurações do Spring dentro do Bean onde são usadas, o que facilita significativamente o entendimento do código.
O Autowired (@Autowired) é a anotação mais utiliza com relação a injeção de dependências. Como o próprio nome diz, o Autowired, indica um ponto aonde a injeção automática deve ser aplicada. Esta pode ser usada em métodos, atributos e construtores. No exemplo abaixo podemos verificar um exemplo de uso do Autowired.
@Service
public class UsuarioService { @Autowired
private ProdutoRepository produtoRepository; private final UsuarioRepository usuarioRepository; @Autowired
public UsuarioService(UsuarioRepository usuarioRepository) {
this.usuarioRepository = usuarioRepository;
} ............
}
Definimos a anotação acima do local onde queremos que o Spring injete a dependência. É importante frisar que o Autowired pode ser utilizada apenas uma vez por construtor. E lembrando que é necessário que a classe a ser injetada pelo Spring esteja anotado com Component (@Component) ou uma de suas especialidades (@Service, @Repository ou @Controller).
É possível também definir um parâmetro required para injeção obrigatório ou não.
............@Autowired(required=true)............
Com o required setado como true, caso o Spring tenha algum problema e não consiga injetar a dependência, será disparada uma exceção UnsatisfiedDependencyException.
É possível também utilizar qualificadores para facilitar ao Spring achar a dependência certa à ser injetada e em caso de referência duplicada, evitar a exceção NoUniqueBeanDefinitionException.
Com o Autowired definido, o Spring pode fazer a sua parte e injetar as dependências, facilitando a vida do programador e permitindo um programação voltada a interface com o baixo acoplamento.
- Injeção de dependências com Spring [Alexandre Afonso, 2017]
- Vire o jogo com Spring Framework [Henrique Lobo Weissmann]