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>
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(); }
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>
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(); } }
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; } } }
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!