Sping框架-使用注解實現自動裝配 @Repository @Service @Autowired(required=false)


通過上面的學習,現在我們進入實戰演練,上代碼

 1 package dao.impl;  2 
 3 import org.springframework.stereotype.Repository;  4 
 5 import dao.UserDao;  6 import entity.User;  7 
 8 /**  9  * 用戶DAO類,實現UserDao接口,負責User類的持久化操作 10  */
11 //給數據訪問層加上注解,名字隨便起
12 @Repository("userDao") 13 public class UserDaoImpl implements UserDao { 14 
15     public void save(User user) { 16         // 這里並未實現完整的數據庫操作,僅為說明問題
17         System.out.println("保存用戶信息到數據庫"); 18  } 19 }
 1 package service.impl;  2 
 3 import org.springframework.beans.factory.annotation.Autowired;  4 import org.springframework.beans.factory.annotation.Qualifier;  5 import org.springframework.stereotype.Service;  6 
 7 import service.UserService;  8 
 9 import dao.UserDao; 10 import entity.User; 11 
12 /** 13  * 用戶業務類,實現對User功能的業務管理 14  */
15 @Service("userService") 16 public class UserServiceImpl implements UserService { 17 
18     @Autowired  // 默認按類型匹配
19     private UserDao dao; 20 
21     
22     public void setDao(UserDao dao) { 23         this.dao = dao; 24  } 25 
26     public void addNewUser(User user) { 27         // 調用用戶DAO的方法保存用戶信息
28  dao.save(user); 29  } 30 }

applicationContext.xml核心配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
 7     http://www.springframework.org/schema/context 
 8     http://www.springframework.org/schema/context/spring-context-3.2.xsd">
 9     <!-- 掃描包中注解標注的類 -->
10     <context:component-scan base-package="service,dao" />
11 </beans>
編寫測試類:
1
package test; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 import service.UserService; 7 8 import entity.User; 9 10 public class Test { 11 @org.junit.Test 12 public void test() { 13 // 使用ApplicationContext接口的實現類ClassPathXmlApplicationContext加載Spring配置文件 14 ApplicationContext ctx = new ClassPathXmlApplicationContext( 15 "applicationContext.xml"); 16 // 通過ApplicationContext接口的getBean()方法獲取id或name為userService的Bean實例 17 UserService service = (UserService) ctx.getBean("userService"); 18 19 User user = new User(); 20 user.setId(1); 21 user.setUsername("test"); 22 user.setPassword("123456"); 23 user.setEmail("test@xxx.com"); 24 25 service.addNewUser(user); 26 } 27 }

運行結果:

-Returning cached instance of singleton bean 'userService'
保存用戶信息到數據庫

通過上面的運行我們發現,核心配置文件里面的內容就少多了,只需要引入context注解就可以了,@Autowired注解是按照類型自動進行裝配的,當然如果有兩個類型的話,是會報錯的,下面演示一下。

 

 在創建一個數據訪問的對象實例

UserDaoImpl.java

 1 package dao.impl;  2 
 3 import org.springframework.stereotype.Repository;  4 
 5 import dao.UserDao;  6 import entity.User;  7 
 8 /**  9  * 用戶DAO類,實現UserDao接口,負責User類的持久化操作 10  */
11 //給數據訪問層加上注解,名字隨便起
12 @Repository("userDao2") 13 public class UserDaoImpl2 implements UserDao { 14 
15     public void save(User user) { 16         // 這里並未實現完整的數據庫操作,僅為說明問題
17         System.out.println("保存用戶信息到數據庫"); 18  } 19 }

運行測試類,發現報錯了:異常信息:

Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private dao.UserDao service.impl.UserServiceImpl.dao; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [dao.UserDao] is defined: expected single matching bean but found 2: userDao,userDao2

解決辦法:

修改UserServiceImpl.java

 1 package service.impl;  2 
 3 import org.springframework.beans.factory.annotation.Autowired;  4 import org.springframework.beans.factory.annotation.Qualifier;  5 import org.springframework.stereotype.Service;  6 
 7 import service.UserService;  8 
 9 import dao.UserDao; 10 import entity.User; 11 
12 /**
13  * 用戶業務類,實現對User功能的業務管理 14  */
15 @Service("userService") 16 public class UserServiceImpl implements UserService { 17 
18     @Autowired  // 默認按類型匹配
19     @Qualifier("userDao") // 按指定名稱匹配 這樣就能指定唯一的UserDao類型,也就是唯一的一個要實例化的userDaoImpl對象實例
20     private UserDao dao; 21 
22     // 使用@Autowired直接為屬性注入,可以省略setter方法
23     /*public void setDao(UserDao dao) { 24  this.dao = dao; 25  }*/
26 
27     public void addNewUser(User user) { 28         // 調用用戶DAO的方法保存用戶信息
29  dao.save(user); 30  } 31 }

運行測試方法,不報錯了。

接下來,在探討一個知識點,使用構造方法進行注入,其他的不變,只需要變動UserServiceImpl.java

 1 package service.impl;  2 
 3 import org.springframework.beans.factory.annotation.Autowired;  4 import org.springframework.beans.factory.annotation.Qualifier;  5 import org.springframework.stereotype.Service;  6 
 7 import service.UserService;  8 
 9 import dao.UserDao; 10 import entity.User; 11 
12 /**
13  * 用戶業務類,實現對User功能的業務管理 14  */
15 @Service("userService") 16 public class UserServiceImpl implements UserService { 17     private UserDao dao; 18 
19    //根據編碼習慣,建議保留無參構造方法
20     public UserServiceImpl() { 21         
22  } 23     //創建帶有參數的構造方法
24     @Autowired  // 默認按類型匹配 25      // 按指定名稱匹配 這樣就能指定唯一的UserDao類型,也就是唯一的一個要實例化的userDaoImpl對象實例
26     public UserServiceImpl(@Qualifier("userDao")UserDao dao) { 27         this.dao = dao; 28  } 29     public void addNewUser(User user) { 30         // 調用用戶DAO的方法保存用戶信息
31  dao.save(user); 32  } 33 }

運行測試方法:

保存用戶信息到數據庫

下面我們在學習一下,@Autowired注解的一個屬性required  

修改UserServiceImpl.java

 1 package service.impl;  2 
 3 import org.springframework.beans.factory.annotation.Autowired;  4 import org.springframework.beans.factory.annotation.Qualifier;  5 import org.springframework.stereotype.Service;  6 
 7 import service.UserService;  8 
 9 import dao.UserDao; 10 import entity.User; 11 
12 /**
13  * 用戶業務類,實現對User功能的業務管理 14  */
15 @Service("userService") 16 public class UserServiceImpl implements UserService { 17     private UserDao dao; 18 
19    //根據編碼習慣,建議保留無參構造方法
20     public UserServiceImpl() { 21         
22  } 23     //創建帶有參數的構造方法
24     @Autowired  // 默認按類型匹配 25      // 按指定名稱匹配 這樣就能指定唯一的UserDao類型,也就是唯一的一個要實例化的userDaoImpl對象實例
26     public UserServiceImpl(@Qualifier("userDao3")UserDao dao) { 27         this.dao = dao; 28  } 29     public void addNewUser(User user) { 30         // 調用用戶DAO的方法保存用戶信息
31  dao.save(user); 32  } 33 }

運行結果:--控制台報異常了

Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userService' defined in file [C:\Users\視頻\05\3.使用注解實現IoC的配置\2.案例\示例7:使用Spring注解實現IoC(教材示例18-21)\示例18-21:使用Spring注解實現IoC\example4\bin\service\impl\UserServiceImpl.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [dao.UserDao]: : No qualifying bean of type [dao.UserDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=userDao3)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [dao.UserDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=userDao3)}

這時候,我們修改一下UserServiceImpl.java    required=false

 1 package service.impl;  2 
 3 import org.springframework.beans.factory.annotation.Autowired;  4 import org.springframework.beans.factory.annotation.Qualifier;  5 import org.springframework.stereotype.Service;  6 
 7 import service.UserService;  8 
 9 import dao.UserDao; 10 import entity.User; 11 
12 /**
13  * 用戶業務類,實現對User功能的業務管理 14  */
15 @Service("userService") 16 public class UserServiceImpl implements UserService { 17     private UserDao dao; 18 
19    //根據編碼習慣,建議保留無參構造方法
20     public UserServiceImpl() { 21         
22  } 23     //創建帶有參數的構造方法
24     @Autowired(required=false)  // 默認按類型匹配 25      // 按指定名稱匹配 這樣就能指定唯一的UserDao類型,也就是唯一的一個要實例化的userDaoImpl對象實例
26     public UserServiceImpl(@Qualifier("userDao3")UserDao dao) { 27         this.dao = dao; 28  } 29     public void addNewUser(User user) { 30         // 調用用戶DAO的方法保存用戶信息
31  dao.save(user); 32  } 33 }

運行測試方法,發現控制台沒有報異常,但是也沒有注入成功。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM