Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Função do @Autowired no Spring Framework

Olá, já estudei Spring MVC e ainda tenho dúvida sobre a função da annotation @Autowired. Para que serve e por que é útil? Pelo que eu entendi, se o desenvolvedor coloca o @Autowired no atributo e cria um construtor que recebe como parâmetro este atributo anotado, este construtor se torna reduntante, uma vez que quando o objeto da classe é instanciado, o atributo deve ser passado como parâmetro e sobreescreve o próprio atributo que foi anotado. Portanto, a melhor forma de se utilizar o @Autowired seria criar o atributo sem a annotation e criar um construtor anotado com @Autowired, que recebe este atributo como parâmetro. Desta forma, o atributo não é sobreescrito, já que ele é apenas instanciado quando o construtor é chamado. Queria saber se minha explicação está correta.

1 resposta
solução!

Oi Erica, tudo bem ?

Em tese a ideia é fazer o conceito chamado injeção de dependência.

O Spring permite fazer diversas formas

  • Através da anotação em cada atributo:

@Controller
public class MeuController {

    @Autowired
    private UmDao dao;
}
  • Através da anotação no construtor:

@Controller
public class MeuController {

    private UmDao dao;

    @Autowired
    public MeuController(UmDao dao) {
        this.dao = dao;
    }

}
  • Através da associação direta:

@Controller
public class MeuController {

    private UmDao dao;

    public MeuController(UmDao dao) {
        this.dao = dao;
    }

}

Ambos formatos são válidos e funcionam, tendo prós e contras.

A primeira solução é boa no caso de deixar claro tudo que está sendo injetado ou não, contudo é ruim, porque todas vezes precisamos fazer a anotação.

A segunda já resolve o problema da primeira, você evita ficar anotando tudo.

A terceira foi a solução da galera esquecer de colocar a anotação no construtor, contudo pode não ser muito claro o que está acontecendo ali.

Um detalhe muito importante: o Spring só consegue injetar objetos que sejam Components dele.