今天我會在spring入門1的基礎上,對1中的bean.xml進行改進,採用註解配置,實現與1中一樣的功能。java
曾經XML的配置:spring
用於建立對象的api
*
*
用於注入數據的框架
*測試
*
用於改變做用範圍的prototype
*
和生命週期相關 (瞭解)指針
*/code
配置bean.xml
爲了使用註解配置,必定要改變版本信息,以下文件頭所示(能夠在spring幫助文檔中,點擊core,ctrl+f查找xmlns:cont,複製看到的版本信息到bean.xml便可)。component
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--告知spring在建立容器時要掃描的包,配置所須要的標籤不是在bean.xml的約 束中,而是一個名稱爲context名稱空間和約束中--> <context:component-scan base-package="com.itheima"></context:component-scan> </beans>
將類加入容器
咱們在要添加到spring容器的類前面加@Component註解,便可將其加入容器。可是你覺得這樣就好了嗎?想多了。spring怎麼知道哪一個類被註解了呢 ?以咱們須要告訴spring到哪裏掃描註解。在bean.xml的</context:component-scan>標籤中配置base-package屬性便可,咱們選擇com.itheima,就會掃描這個包下全部類上的註解。xml
@Component public class AccountServiceImpl implements IAccountService { private IAccountDao accountDao; public void saveAccount(){ accountDao.saveAccount(); } }
固然也能夠爲上述註解設置一個Id
@Component(value = "AccountService") public class AccountServiceImpl implements IAccountService { private IAccountDao accountDao; public void saveAccount(){ accountDao.saveAccount(); } }
持久層註解
@Repository("accountDao") public class AccountDaoImpl implements IAccountDao { public void saveAccount(){ System.out.println("保存了帳戶"); } }
對其測試(這裏同時用了第二種獲取容器對象的方法)
IAccountDao addo = ac.getBean("accountDao",IAccountDao.class); System.out.println(addo);
注入數據
上述代碼調用咱們調用as.saveAccount()方法會報空指針異常,這是由於as中的private IAccountDao accountDao沒有注入對象。解決方式以下
*Autowired註解
使用了該註解後,須要注入對象的類會在容器中尋找相同類型的類,找到一個就直接把它注入。找到多個,按名字相同的注入,不然報錯
@Component(value = "AccountService") public class AccountServiceImpl implements IAccountService { @Autowired private IAccountDao accountDao; public void saveAccount(){ accountDao.saveAccount(); } }
@Repository("accountDao2") public class AccountDaoImpl2 implements IAccountDao { public void saveAccount(){ System.out.println("保存了帳戶222"); } }
多個Bean類型的解決方式
1 Autowired配合Qualifier使用
@Component(value = "AccountService") public class AccountServiceImpl implements IAccountService { @Autowired @Qualifier(value = "accountDao1") private IAccountDao accountDao; public void saveAccount(){ accountDao.saveAccount(); } }
2 Resource註解
@Service(value = "AccountService") public class AccountServiceImpl implements IAccountService { @Resource(name="accountDao1") private IAccountDao accountDao; public void saveAccount(){ accountDao.saveAccount(); } }
不過使用該註解須要導包(導包時可能發生不知名錯誤,但就是這個包,重導幾回就行)
<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>