Serie Spring [6, montaje automático Bean]

6. Montaje automático de frijol

  • El cableado automático es una forma en que Spring satisface las dependencias de los beans
  • Spring lo buscará automáticamente en el contexto y ensamblará automáticamente las propiedades para el bean

Hay tres formas de montaje en Spring

1. Configuración mostrada en xml

2. Configuración de pantalla en java

3. Ensamblaje automático implícito de frijoles [importante]

.

6.1, montaje automático de byName y byType

Construcción del entorno

  • Una persona tiene dos mascotas: personas–>gato/perro
public class Cat {
    
    
    public void shout() {
    
    
        System.out.println("喵");
    }
}
public class Dog {
    
    
    public void shout() {
    
    
        System.out.println("汪");
    }
}
public class People {
    
    
    private Cat cat;
    private Dog dog;
    private String name;
}

6.1.1, montaje automático byName**

    <bean id="cat" class="com.only.pojo.Cat"/>
    <bean id="dog" class="com.only.pojo.Dog"/>
    
<!--    <bean id="people" class="com.only.pojo.People">-->
<!--        <property name="name" value="吴夜"/>-->
<!--        <property name="cat" ref="cat"/>-->
<!--        <property name="dog" ref="dog"/>-->
<!--    </bean>-->

<!--  byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid  -->
    <bean id="people" class="com.only.pojo.People" autowire="byName">
        <property name="name" value="吴夜"/>
    </bean>

6.1.2, montaje automático byType**

    <bean class="com.only.pojo.Cat"/>
    <bean id="dog111" class="com.only.pojo.Dog"/>
    
<!--    <bean id="people" class="com.only.pojo.People">-->
<!--        <property name="name" value="吴夜"/>-->
<!--        <property name="cat" ref="cat"/>-->
<!--        <property name="dog" ref="dog"/>-->
<!--    </bean>-->

    <!--
      byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid
      byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean
      -->
    <bean id="people" class="com.only.pojo.People" autowire="byType">
        <property name="name" value="吴夜"/>
    </bean>

resumen:

  • byName, es necesario asegurarse de que la identificación de todos los beans sea única, y este bean debe ser consistente con el valor del método set de la propiedad inyectada automáticamente
  • byType, es necesario asegurarse de que la clase de todos los beans sea única, y este bean debe ser coherente con el tipo de la propiedad inyectada automáticamente

6.2 Uso de anotaciones para realizar ensamblajes automáticos

Notas sobre el uso de anotaciones:

1. Restricciones de importación

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

2. Contexto de soporte de anotaciones de configuración: annotation-config

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
        
    <context:annotation-config/>
    
</beans>

A continuación, obtenga información sobre algunas de estas anotaciones.

6.2.1, @Autowired [comúnmente utilizado]

  • Se puede usar directamente en el atributo, o se puede usar en el método set
  • El uso de Autowired no necesita escribir un método establecido, siempre que su propiedad autowired exista en el contenedor IOC (Spring) y se ajuste al nombre byName.
  • Por lo tanto, en 6.1, ya no use byName o byType para el ensamblaje automático, y use directamente anotaciones en la clase de personas para el ensamblaje automático:
public class People {
    
    

    @Autowired
    private Cat cat;
    @Autowired(required = false)
    private Dog dog;
    private String name;
}

Ciencia:

@Nullable Si el campo está marcado con esta anotación, significa que el campo puede ser nulo

6.2.2, @Calificador

Si el entorno de ensamblaje automático de @Autowired es complejo y el ensamblaje automático no se puede completar a través de una anotación [@Autowired], podemos usar Qualifer(value="xxx") para configurar el uso de @Autowired y especificar una inyección de objeto de bean único.

public class People {
    
    
    @Autowired
    @Qualifier(value = "cat1")
    private Cat cat;
    @Autowired
    @Qualifier(value = "dog2")
    private Dog dog;
    private String name;
}

El contenido de configuración es:

<!-- 开启注解的支持 -->
<context:annotation-config/>

<bean id="cat1" class="com.only.pojo.Cat"/>
<bean id="cat2" class="com.only.pojo.Cat"/>
<bean id="dog1" class="com.only.pojo.Dog"/>
<bean id="dog2" class="com.only.pojo.Dog"/>
<bean id="people" class="com.only.pojo.People"/>

6.2.2, @Recurso

  • @Resource es la inyección de anotaciones en primavera.
  • De forma predeterminada, se ensambla de acuerdo con el nombre, y el nombre se puede especificar a través del atributo de nombre.
  • Si no se especifica el atributo de nombre, cuando se escribe la anotación en el campo, el nombre del campo se utiliza de forma predeterminada para buscar por nombre
  • Si la anotación se escribe en el método setter, el nombre del atributo se usa para el ensamblaje de forma predeterminada.
  • El cableado se realiza por tipo cuando no se encuentra ningún bean que coincida con el nombre.
  • Pero debe tenerse en cuenta que si se especifica el atributo de nombre, solo se ensamblará de acuerdo con el nombre.
public class People {
    
    
    @Resource
    private Cat cat;
    @Resource(name = "dog2")
    private Dog dog;
    private String name;
}
<!-- 开启注解的支持 -->
<context:annotation-config/>

<bean id="cat" class="com.only.pojo.Cat"/>
<bean id="cat2" class="com.only.pojo.Cat"/>
<bean id="dog" class="com.only.pojo.Dog"/>
<bean id="dog2" class="com.only.pojo.Dog"/>
<bean id="people" class="com.only.pojo.People"/>

6.3 Resumen

La diferencia entre @Resource y @Autowired:

  • Ambos se utilizan para el ensamblaje automático y se pueden colocar en el campo de atributo
  • @Autowired se implementa mediante byType y se debe exigir que el objeto exista. [comúnmente utilizado]
  • @Resource se implementa mediante byName de forma predeterminada y byType si no se puede encontrar el nombre. Si no se encuentra ninguno de ellos, se informará un error. [comúnmente utilizado]
  • El orden de ejecución es diferente: @Autowired es implementado por byType. @Resource está implementado por byName de forma predeterminada.

Supongo que te gusta

Origin blog.csdn.net/weixin_39379635/article/details/115741363
Recomendado
Clasificación