Sobre el montaje automático de Spring's Bean

Configuración automática xml

por nombre

autowire byName (autowire por nombre)

En el proceso de configuración manual de xml, a menudo ocurren errores como letras faltantes y uso de mayúsculas, y no se pueden verificar, lo que reduce la eficiencia del desarrollo.

El uso de montaje automático evitará estos errores y simplificará la configuración.

prueba:

1. Modifique la configuración del bean y agregue un atributo autowire = "byName"

<bean id="user" class="com.kuang.pojo.User" autowire="byName">
   <property name="str" value="qinjiang"/>
</bean>

2. Vuelva a realizar la prueba, el resultado se sigue emitiendo correctamente.

3. Modificamos la identificación del bean de cat a catXXX

4. Pruebe de nuevo y notifique una java.lang.NullPointerException de puntero nulo durante la ejecución. Debido a que el método set no se puede encontrar de acuerdo con la regla byName, el setCat real no se ejecuta y el objeto no se inicializa, por lo que se informará un error de puntero nulo cuando se llame.

resumen:

Cuando un nodo de frijol tiene el atributo de autowire byName.

Encontrará todos los nombres de métodos establecidos en su clase, como setCat, y obtendrá la cadena con el conjunto eliminado y la primera letra en minúscula, es decir, cat.

Vaya al contenedor de primavera para encontrar si hay un objeto con esta identificación de nombre de cadena.

Si la hay, elimine la inyección; si no, informe una excepción de puntero nulo.

por tipo

autowire byType (montaje automático por tipo)

El uso de autowire byType primero debe garantizar que los objetos del mismo tipo sean únicos en el contenedor de resorte. Si no es único, se notificará una excepción no única.


Prueba NoUniqueBeanDefinitionException :

1. Modifique la configuración del bean del usuario: autowire = "byType"

2. Prueba, salida normal

3. ¡Registre un objeto de frijol gato!

<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>

<bean id="user" class="com.kuang.pojo.User" autowire="byType">
   <property name="str" value="qinjiang"/>
</bean>

4. Prueba, error: NoUniqueBeanDefinitionException

5. ¡Elimina cat2 y cambia el nombre de frijol de cat! ¡prueba! Debido a que está ensamblado por tipo, no se informará ninguna excepción y el resultado final no se verá afectado. Incluso eliminar el atributo id no afecta el resultado.

¡Este es un montaje automático según el tipo!

Configuración automática de anotaciones

Usar anotaciones

jdk1.5 comenzó a admitir anotaciones y spring2.5 comenzó a admitir completamente las anotaciones.

Preparación: use anotaciones para inyectar atributos.

1. Introduzca el encabezado del archivo de contexto en el archivo de configuración de Spring

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd

2. ¡Active el soporte de anotaciones de atributos!

<context:annotation-config/>

@Autowired

@Autowired se transfiere automáticamente por tipo y no admite la coincidencia de ID.

¡Necesita importar el paquete spring-aop!

prueba:

1. Elimine el método set en la clase User y use la anotación @Autowired

public class User {
    
    
   @Autowired
   private Cat cat;
   @Autowired
   private Dog dog;
   private String str;

   public Cat getCat() {
    
    
       return cat;
  }
   public Dog getDog() {
    
    
       return dog;
  }
   public String getStr() {
    
    
       return str;
  }
}

2. El contenido del archivo de configuración en este momento.

<context:annotation-config/>

<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="user" class="com.kuang.pojo.User"/>

3. ¡Pruebe y emita el resultado con éxito!

@Autowired (obligatorio = falso) Descripción: falso, el objeto puede ser nulo; verdadero, el objeto debe estar almacenado en el objeto, no nulo.

// Si el objeto permitido es nulo, establezca required = false, el valor predeterminado es verdadero
@Autowired (required = false)
private Cat cat;

@Calificatorio

@Autowired se ensambla automáticamente de acuerdo con el tipo, y @Qualifier se puede ensamblar automáticamente de acuerdo con el método byName

@Qualifier no se puede utilizar solo.

Pasos del experimento de prueba:

1. Modifique el contenido del archivo de configuración para asegurarse de que el objeto existe para el tipo. ¡Y el nombre no es el nombre predeterminado de la clase!

2. No se agrega ninguna prueba de calificador y se informa un error

3. Agregue anotaciones de calificador a los atributos.

@Autowired
@Qualifier(value = "cat2")
private Cat cat;
@Autowired
@Qualifier(value = "dog2")
private Dog dog;

Prueba, salida con éxito!

@Recurso

Si @Resource tiene el atributo de nombre especificado, primero realice la búsqueda por nombre y el ensamblaje de acuerdo con este atributo;

Luego proceda al método byName predeterminado para el ensamblaje;

Si nada de lo anterior tiene éxito, se ensamblará automáticamente en el método byType.

Si no tiene éxito, se informará una excepción.

Clase de entidad:

public class User {
    
    
   //如果允许对象为null,设置required = false,默认为true
   @Resource(name = "cat2")
   private Cat cat;
   @Resource
   private Dog dog;
   private String str;
}

beans.xml

<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat1" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>

<bean id="user" class="com.kuang.pojo.User"/>

Prueba: el resultado es correcto

Archivo de configuración 2: beans.xml, eliminar cat2

<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat1" class="com.kuang.pojo.Cat"/>

Mantener solo anotaciones en la clase de entidad

@Resource
private Cat cat;
@Resource
private Dog dog;

Resultado: OK

Conclusión: La búsqueda por nombre se realiza primero y falla; luego se realiza la búsqueda por tipo y tiene éxito.

resumen

Similitudes y diferencias entre @Autowired y @Resource:

1. Tanto @Autowired como @Resource se pueden usar para ensamblar beans. Puede escribirse en el campo o en el método setter.

2. @Autowired se ensambla por tipo de forma predeterminada (perteneciente a la especificación de resorte). De manera predeterminada, el objeto dependiente debe existir. Si desea permitir un valor nulo, puede establecer su atributo requerido en falso, como: @Autowired (requerido = falso), si queremos usar el ensamblaje del nombre se puede combinar con las anotaciones @Qualifier para usar

3. @Resource (que pertenece al retorno de J2EE), que se ensambla por nombre de forma predeterminada, y el nombre se puede especificar mediante el atributo de nombre. Si no se especifica el atributo de nombre, cuando la anotación se escribe en el campo, el nombre del campo se utiliza para buscar por nombre de forma predeterminada. Si la anotación se escribe en el método de establecimiento, el nombre de atributo se utiliza para ensamblar de forma predeterminada. Cuando no se encuentra ningún bean que coincida con el nombre, el ensamblaje se realiza de acuerdo con el tipo. Pero debe tenerse en cuenta que si se especifica el atributo de nombre, solo se ensamblará de acuerdo con el nombre.

Tienen la misma función y están inyectando objetos con anotaciones, pero el orden de ejecución es diferente. @Autowired first byType, @Resource first byName.

Supongo que te gusta

Origin blog.csdn.net/david2000999/article/details/114552243
Recomendado
Clasificación