Série de printemps [6, assemblage automatique de haricots]

6. Assemblage automatique de haricots

  • Le câblage automatique est un moyen pour Spring de satisfaire les dépendances de bean
  • Spring le recherchera automatiquement dans le contexte et assemblera automatiquement les propriétés du bean

Il y a trois façons d'assembler au printemps

1. Configuration affichée en xml

2. Afficher la configuration en java

3. Assemblage automatique implicite de beans [important]

.

6.1, assemblage automatique de byName et byType

Construction de l'environnement

  • Une personne a deux animaux de compagnie : personnes -> chat/chien
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, assemblage automatique 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, parType assemblage automatique**

    <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>

résumé:

  • byName, il est nécessaire de s'assurer que l'id de tous les beans est unique, et ce bean doit être cohérent avec la valeur de la méthode set de la propriété automatiquement injectée
  • byType, il est nécessaire de s'assurer que la classe de tous les beans est unique, et ce bean doit être cohérent avec le type de la propriété automatiquement injectée

6.2. Utiliser des annotations pour réaliser un assemblage automatique

Remarques sur l'utilisation des annotations :

1. Contraintes d'importation

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

2. Contexte de prise en charge des annotations de configuration : 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>

Ci-dessous, découvrez certaines de ces annotations.

6.2.1, @Autowired [couramment utilisé]

  • Il peut être utilisé directement sur l'attribut, ou il peut être utilisé dans la méthode set
  • L'utilisation d'Autowired n'a pas besoin d'écrire une méthode set, à condition que votre propriété autowired existe dans le conteneur IOC (Spring) et soit conforme au nom byName.
  • Ainsi, en 6.1, n'utilisez plus byName ou byType pour l'assemblage automatique, et utilisez directement les annotations dans la classe people pour l'assemblage automatique :
public class People {
    
    

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

Science:

@Nullable Si le champ est marqué avec cette annotation, cela signifie que le champ peut être nul

6.2.2、@Qualif.

Si l'environnement de l'assemblage automatique @Autowired est complexe et que l'assemblage automatique ne peut pas être complété par une annotation [@Autowired], nous pouvons utiliser Qualifer(value="xxx") pour configurer l'utilisation de @Autowired et spécifier une injection d'objet bean unique.

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

Le contenu de la configuration est :

<!-- 开启注解的支持 -->
<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、@Ressource

  • @Resource est l'injection d'annotations au printemps.
  • Par défaut, il est assemblé en fonction du nom, et le nom peut être spécifié via l'attribut name.
  • Si l'attribut name n'est pas spécifié, lorsque l'annotation est écrite sur le champ, le nom du champ est utilisé par défaut pour rechercher par nom
  • Si l'annotation est écrite sur la méthode setter, le nom de l'attribut est utilisé pour l'assemblage par défaut.
  • Le câblage est effectué par type lorsqu'aucun bean correspondant au nom n'est trouvé.
  • Mais il convient de noter que si l'attribut name est spécifié, il ne sera assemblé qu'en fonction du nom.
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 Résumé

La différence entre @Resource et @Autowired :

  • Les deux sont utilisés pour l'assemblage automatique et peuvent être placés sur le champ d'attribut
  • @Autowired est implémenté par byType et l'objet doit obligatoirement exister. [couramment utilisé]
  • @Resource est implémenté par byName par défaut. Si le nom est introuvable, il est implémenté par byType. Si aucun d'entre eux ne peut être trouvé, une erreur sera signalée. [couramment utilisé]
  • L'ordre d'exécution est différent : @Autowired est implémenté par byType. @Resource est implémenté par byName par défaut.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_39379635/article/details/115741363
conseillé
Classement