Li em alguns posts sobre o Spring MVC e Portlets que a injeção de campo não é recomendada. Pelo que entendi, a injeção de campo é quando você injeta um Bean @Autowired
assim:
@Component
public class MyComponent {
@Autowired
private Cart cart;
}
Durante minha pesquisa, eu também li sobre injeção de construtores :
@Component
public class MyComponent {
private final Cart cart;
@Autowired
public MyComponent(Cart cart){
this.cart = cart;
}
}
Quais são as vantagens e as desvantagens de ambos os tipos de injeção?
EDIT 1: Como esta questão é marcado como duplicata de esta pergunta eu verifiquei. Porque não há exemplos de código nem na pergunta nem nas respostas que não está claro para mim se estou correto com meu palpite sobre o tipo de injeção que estou usando.
Date(int,int,int)
existe.Respostas:
Tipos de injeção
Existem três opções para como as dependências podem ser injetadas em um bean:
Você está usando a opção 3. É isso que está acontecendo quando você usa
@Autowired
diretamente em seu campo.Diretrizes de injeção
Uma diretriz geral, recomendada pela Spring (consulte as seções sobre DI baseada em construtor ou DI baseada em setter ) é a seguinte:
Desvantagens da injeção em campo
As razões pelas quais a injeção de campo é mal vista são as seguintes:
Conclusão
Dependendo de suas necessidades, você deve usar principalmente a injeção de construtor ou alguma mistura de injeção de construtor e setter. A injeção em campo tem muitas desvantagens e deve ser evitada. A única vantagem da injeção de campo é que é mais conveniente escrever, o que não supera todos os contras.
Leitura adicional
Eu escrevi um artigo de blog sobre o motivo pelo qual a injeção de campo geralmente não é recomendada: Injeção de dependência de campo considerada prejudicial .
fonte
Essa é uma das discussões sem fim no desenvolvimento de software, mas os principais influenciadores do setor estão ficando mais opinativos sobre o assunto e começaram a sugerir a injeção de construtores como a melhor opção.
Injeção de construtor
Prós:
Contras:
Basicamente, a injeção de campo é o oposto.
fonte
Questão de gosto. É sua decisão.
Mas posso explicar por que nunca uso injeção de construtor .
Eu não quero implementar um construtor para todos os meus
@Service
,@Repository
e@Controller
feijão. Quero dizer, existem cerca de 40 a 50 grãos ou mais. Toda vez que eu adicionasse um novo campo, eu teria que estender o construtor. Não. Eu não quero e não preciso.E se o seu Bean (Serviço ou Controlador) exigir que muitos outros beans sejam injetados? Um construtor com 4 ou mais parâmetros é muito feio.
Se eu estiver usando CDI, o construtor não me preocupa.
EDIT # 1 : Vojtech Ruzicka disse:
Sim. Teoria e realidade. Aqui está um exemplo:
DashboardController
mapeado para o caminho único*:8080/dashboard
.Minhas
DashboardController
coleta muitas informações de outros serviços para exibi-las em uma página de visão geral do painel / sistema. Eu preciso desse controlador único. Portanto, tenho que proteger apenas esse caminho (autenticação básica ou filtro de função de usuário).EDIT # 2 : Como todos estão focados nos 8 parâmetros do construtor ... Este foi um exemplo do mundo real - um código legado de clientes. Eu mudei isso. A mesma argumentação se aplica a mim para mais de 4 parâmetros.
É tudo sobre injeção de código, não construção de instância.
fonte
Mais um comentário - Vojtech Ruzicka afirmou que o Spring injeta feijão de três maneiras (a resposta com o maior número de pontos):
Esta resposta é ERRADA - porque PARA CADA TIPO DE MOLA DE INJEÇÃO USAM REFLEXÃO! Use o IDE, defina o ponto de interrupção no configurador / construtor e verifique.
Isso pode ser uma questão de gosto, mas também pode ser uma questão de CASO. O @dieter forneceu um excelente caso quando a injeção no campo é melhor. Se você estiver usando injeção de campo em testes de integração que estão configurando o contexto Spring - o argumento com testabilidade da classe também é inválido - a menos que você queira gravar posteriormente os testes nos testes de integração;)
fonte