Spring Framework – @Autowired e Construtores

Dias atrás eu estava relendo o guia de referência do Spring Framework, em busca de uma informação sobre o processo de conversão de dados e acabei por acaso encontrando um trecho bastante interessante sobre o processo de injeção de dependências.  A partir da versão 4.3, a anotação @Autowired, usada para injetar beans em uma classe se faz desnecessária quando usamos um único método construtor na classe que requer a injeção de dependência. 

Por exemplo, suponha que você tenha a classe PersonDAO, a qual é um bean marcado com a anotação @Repository:

@Repository
public class PersonDao {
    
    public void save(Person person){ ... }
    public void update(Person person){ ... }
}

Ao injetar PersonDAO em PersonService via método construtor, seria necessário antes da versão 4.3, do Spring Framework, utilizar o seguinte processo:

@Service
public class PersonService {
    
    private PersonDAO dao;
    
    @Autowired
    public PersonService(PersonDAO dao) {
        this.dao = dao;
    }
}

Atualmente, a versão 4.3 e as versões posteriores a ela, não fazem mais a obrigatoriedade de se anotar o método construtor com @Autowired. Desta forma, removendo a anotação a injeção será realizada normalmente. Mas esse processo só vai ocorrer com sucesso se existir um único método construtor na classe. Assim, você poderia remover sem problemas a anotação, deixando seu código mais limpo, como no exemplo a seguir:

@Service
public class PersonService {
    
    private PersonDAO dao;
    
    public PersonService(PersonDAO dao) {
        this.dao = dao;
    }
}

Entretando, caso você não use o método construtor para injetar seus beans, a @Autowired deverá ser usada sobre os atributos ou sobre os métodos modificadores (set). E é claro, se ainda desejar, poderá continuar anotando seus métodos construtores com @Autowired que vai funcionar normalmente. Agora é com você, faça os testes e decida se vai aderir a este nova forma de lidar com este recurso do Spring Framework. 

No guia de referência do Spring Framework você vai encontar o seguinte texto:

As of Spring Framework 4.3, an @Autowired annotation on such a constructor is no longer necessary if the target bean only defines one constructor to begin with. However, if several constructors are available, at least one must be annotated to teach the container which one to use.

Referência:

Ballem

Marcio Ballem é bacharel em Sistemas de Informação pelo Centro Universitário Franciscano em Santa Maria/RS. Tem experiência com desenvolvimento Delphi e Java em projetos para gestão pública e acadêmica. Possui certificação em Java, OCJP 6.

Você pode gostar...