Autowired e a injeção de dependência do Spring

Leonardo Giuliani
2 min readOct 27, 2019

--

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]

--

--

Leonardo Giuliani

Desenvolvedor, entusiasta e apaixonado por software e todo tipo de tecnologia. Pós-graduando de Engenharia de Software.