Maison > Java > javaDidacticiel > Trois méthodes d'injection couramment utilisées au printemps

Trois méthodes d'injection couramment utilisées au printemps

Guanhui
Libérer: 2020-06-02 11:08:15
original
5588 Les gens l'ont consulté

Trois méthodes d'injection couramment utilisées au printemps

Trois méthodes d'injection couramment utilisées au printemps

1 La méthode de construction, utilisant la réflexion, complète l'injection par la méthode de construction.

Tout d'abord, comprenons brièvement la structure du projet de test. Il est construit avec maven et comporte quatre packages :

  • entity : entité de stockage, qui n'a qu'un seul utilisateur. classe

  • dao : accès aux données, une interface, deux classes d'implémentation

  • service : couche de service, une interface, une classe d'implémentation, l'implémentation la classe dépend de IUserDao

  • test : package de test

Enregistrez UserService dans le fichier de configuration Spring et injectez UserDaoJdbc dans un userService via le constructeur- Balise arg. Constructeur paramétré

<!-- 注册userService -->
<bean id="userService" class="com.lyu.spring.service.impl.UserService">
  <constructor-arg ref="userDaoJdbc"></constructor-arg>
</bean>
<!-- 注册jdbc实现的dao -->
<bean id="userDaoJdbc" class="com.lyu.spring.dao.impl.UserDaoJdbc"></bean>
Copier après la connexion

S'il n'y a qu'un seul constructeur paramétré et que le type du paramètre correspond au type du bean injecté, il sera injecté dans le constructeur.

public class UserService implements IUserService {
  private IUserDao userDao;
  
  public UserService(IUserDao userDao) {
    this.userDao = userDao;
  }
  
  public void loginUser() {
    userDao.loginUser();
  }
}
@Test
public void testDI() {
  ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  // 获取bean对象
  UserService userService = ac.getBean(UserService.class, "userService");
  // 模拟用户登录
  userService.loginUser();
}
Copier après la connexion

Résultat de l'impression du test : jdbc-login réussi

Remarque : La méthode loginUser qui simule la connexion de l'utilisateur imprime en fait simplement une instruction de sortie. La sortie de la classe implémentée par jdbc est : jdbc- La connexion est réussie. Le résultat de la classe implémentée par mybatis est : mybatis-login réussi.

2. Le setter utilise également la réflexion, mais l'injection se fait via le setter.

Le fichier de configuration est le suivant :

<!-- 注册userService -->
<bean id="userService" class="com.lyu.spring.service.impl.UserService">
  <!-- 写法一 -->
  <!-- <property name="UserDao" ref="userDaoMyBatis"></property> -->
  <!-- 写法二 -->
  <property name="userDao" ref="userDaoMyBatis"></property>
</bean>
<!-- 注册mybatis实现的dao -->
<bean id="userDaoMyBatis" class="com.lyu.spring.dao.impl.UserDaoMyBatis"></bean>
Copier après la connexion

Remarque : les deux méthodes d'écriture ci-dessus sont acceptables. Spring convertira la première lettre de chaque mot de la valeur du nom en majuscule. puis collez-le devant. Utilisez "set" pour former un nom de méthode, puis recherchez la méthode dans la classe correspondante et appelez-la par réflexion pour réaliser l'injection.

Rappelez-vous : la valeur de l'attribut name n'a rien à voir avec le nom de la variable membre dans la classe ou le nom du paramètre de la méthode set. Elle est uniquement liée au nom de la méthode set correspondante. la méthode peut s'exécuter avec succès

public class UserService implements IUserService {
  private IUserDao userDao1;
  
  public void setUserDao(IUserDao userDao1) {
    this.userDao1 = userDao1;
  }
  
  public void loginUser() {
    userDao1.loginUser();
  }
}
Copier après la connexion

Encore une chose à noter : si vous injectez des attributs via la méthode set, spring instanciera l'objet via le constructeur de paramètres vides par défaut, donc si vous écrivez un constructeur avec des paramètres dans la classe, il doit La méthode constructeur avec des paramètres vides doit être écrite, sinon spring ne pourra pas instancier l'objet, ce qui entraînera une erreur.

3. Sur la base des annotations, celles couramment utilisées sont "@Autowried" et "@Resource".

Exemple de code

// candidateBeans 为上一步通过类型匹配到的多个bean,该 Map 中至少有两个元素。
protected String determineAutowireCandidate(Map<String, Object> candidateBeans, DependencyDescriptor descriptor) {
    //  requiredType 为匹配到的接口的类型
   Class<?> requiredType = descriptor.getDependencyType();
   // 1. 先找 Bean 上有@Primary 注解的,有则直接返回
   String primaryCandidate = this.determinePrimaryCandidate(candidateBeans, requiredType);
   if (primaryCandidate != null) {
       return primaryCandidate;
   } else {
       // 2.再找 Bean 上有 @Order,@PriorityOrder 注解的,有则返回
       String priorityCandidate = this.determineHighestPriorityCandidate(candidateBeans, requiredType);
       if (priorityCandidate != null) {
           return priorityCandidate;
       } else {
           Iterator var6 = candidateBeans.entrySet().iterator();
           String candidateBeanName;
           Object beanInstance;
           do {
               if (!var6.hasNext()) {
                   return null;
               }
               // 3. 再找 bean 的名称匹配的
               Entry<String, Object> entry = (Entry)var6.next();
               candidateBeanName = (String)entry.getKey();
               beanInstance = entry.getValue();
           } while(!this.resolvableDependencies.values().contains(beanInstance) && !this.matchesBeanName(candidateBeanName, descriptor.getDependencyName()));
           return candidateBeanName;
       }
   }
}
Copier après la connexion

Tutoriel recommandé : "Tutoriel Java"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal