logo

Fiação automática na primavera

O recurso de ligação automática da estrutura Spring permite injetar implicitamente a dependência do objeto. Ele usa internamente injeção de setter ou construtor.

A fiação automática não pode ser usada para injetar valores primitivos e de string. Funciona apenas com referência.


Vantagem da fiação automática

Requer o menos código porque não precisamos escrever o código para injetar a dependência explicitamente.


Desvantagem da fiação automática

Nenhum controle do programador.

Não pode ser usado para valores primitivos e de string.


Modos de fiação automática

Existem muitos modos de fiação automática:

método java
Não.ModoDescrição
1)NãoÉ o modo de ligação automática padrão. Isso significa que não há ligação automática por padrão.
2)porNomeO modo byName injeta a dependência do objeto de acordo com o nome do bean. Nesse caso, o nome da propriedade e o nome do bean devem ser iguais. Ele chama internamente o método setter.
3)por tipoO modo byType injeta a dependência do objeto de acordo com o tipo. Portanto, o nome da propriedade e o nome do bean podem ser diferentes. Ele chama internamente o método setter.
4)construtorO modo construtor injeta a dependência chamando o construtor da classe. Ele chama o construtor com um grande número de parâmetros.
5)detecção automáticaEstá obsoleto desde o Spring 3.

Exemplo de fiação automática

Vamos ver o código simples para usar a fiação automática na primavera. Você precisa usar o atributo autowire do elemento bean para aplicar os modos autowire.

 

Vamos ver o exemplo completo de fiação automática na primavera. Para criar este exemplo, criamos 4 arquivos.

  1. B.java
  2. A.java
  3. aplicaçãoContext.xml
  4. Teste.java
B.java

Esta classe contém apenas um construtor e um método.

 package org.sssit; public class B { B(){System.out.println('b is created');} void print(){System.out.println('hello b');} } 
A.java

Esta classe contém referência da classe B, construtor e método.

 package org.sssit; public class A { B b; A(){System.out.println('a is created');} public B getB() { return b; } public void setB(B b) { this.b = b; } void print(){System.out.println('hello a');} void display(){ print(); b.print(); } } 
aplicaçãoContext.xml
 
Teste.java

Esta classe obtém o bean do arquivo applicationContext.xml e chama o método display.

 package org.sssit; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext('applicationContext.xml'); A a=context.getBean('a',A.class); a.display(); } } 

Saída:

 b is created a is created hello a hello b 

1) modo de fiação automática byName

No caso do modo de ligação automática byName, o ID do bean e o nome de referência devem ser iguais.

Ele usa injeção setter internamente.

 

Mas, se você alterar o nome do bean, ele não injetará a dependência.

Vamos ver o código onde estamos alterando o nome do bean de b para b1.

 

2) modo de fiação automática byType

No caso do modo de ligação automática byType, o ID do bean e o nome de referência podem ser diferentes. Mas deve haver apenas um feijão de cada tipo.

Ele usa injeção setter internamente.

 

Nesse caso, funciona bem porque você criou uma instância do tipo B. Não importa se você tem um nome de bean diferente do nome de referência.

Mas, se você tiver vários bean de um tipo, ele não funcionará e lançará uma exceção.

Vamos ver o código onde estão muitos bean do tipo B.

 

Nesse caso, lançará uma exceção.


3) modo de fiação automática do construtor

No caso do modo de ligação automática do construtor, o contêiner Spring injeta a dependência pelo construtor parametrizado mais alto.

memória virtual

Se você tiver 3 construtores em uma classe, zero-arg, one-arg e dois-arg, a injeção será realizada chamando o construtor de dois argumentos.

 

4) sem modo de ligação automática

No caso de não haver modo de ligação automática, o contêiner Spring não injeta a dependência por ligação automática.