Spring IoC(控制反轉(zhuǎn))之注解配置
1. 前言
上兩節(jié),我們學(xué)習(xí)了 Spring IoC 的 xml 配置實現(xiàn),整理了 xml 方式的實現(xiàn)步驟,并且模擬了 Spring 的容器如何加載解析 xml 配置文件,那么我們發(fā)現(xiàn)一點現(xiàn)象:
對于 Spring 的 bean 管理而言,如果全部通過 xml 文件實現(xiàn)的話,配置文件的內(nèi)容未免過于臃腫。因為對于一個類的實例化,就需要一個 bean 標(biāo)簽。
這樣的話,一個大型工程下來,有那么幾百個,幾千個類,Spring 的 xml 文件維護起來,成本實在太高。
疑問導(dǎo)出:
Spring 能否有更方便的方式實現(xiàn) IoC 呢?Spring 提出了兩種 IoC 實現(xiàn)方式,一種是基于配置文件,一種是基于注解形式。
本節(jié),我們學(xué)習(xí)下 Spring IoC 的注解形式是如何實現(xiàn)的。
2. 案例實現(xiàn)
2.1 步驟介紹
回顧 Spring IoC 的 xml 實現(xiàn)步驟:
? 1. 使用 new 關(guān)鍵字對 ClassPathXmlApplicationContext
做初始化;
? 2. 在初始化容器對象的構(gòu)造傳入 xml 配置文件的位置 ;
? 3. 在配置文件中通過 bean 標(biāo)簽可以對類進行描述:類的路徑、類的標(biāo)識、類的構(gòu)造參數(shù)等等。
注解實現(xiàn) IoC 的思路分析:
? 1.Spring 容器一樣需要初始化;
? 2. 一樣需要傳入 xml 配置文件 ----- 需要描述清楚 需要被實例化的類都有哪些;
? 3.xml 文件中 不需要使用 bean 標(biāo)簽描述被實例化的類 ------ 使用注解實現(xiàn) IoC 管理目的就是為了簡化 bean 標(biāo)簽的配置。
疑問導(dǎo)出:
如果是 xml 文件方式實現(xiàn) IoC ,加載 xml 文件的 bean 標(biāo)簽就已經(jīng)知道,需要被實例化的對象,那么如果不使用 bean 標(biāo)簽描述,Spring 框架如何得知哪些類需要被容器管理呢?
核心思想:
開發(fā)人員無需使用 XML 來描述 bean ,而是將配置移入 Java 的類本身,通過 Spring 支持的組件掃描來實現(xiàn)。
看官稍等… 馬上開始我們的案例實現(xiàn)。
2.2 工程實現(xiàn)
創(chuàng)建工程:
為了區(qū)分 xml 工程,坐標(biāo)名稱換成 spring_an ,其實無所謂,大家自行創(chuàng)建即可。
導(dǎo)入依賴:
依賴的坐標(biāo)跟 xml 的工程坐標(biāo)一致即可,無需導(dǎo)入多余的依賴。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
項目代碼:
為了測試,在工程內(nèi)部創(chuàng)建 UserDao
的接口和 UserDao
的實現(xiàn)類 UserDaoImpl
。
UserDao
代碼如下:
public interface UserDao {
public void saveUser();
}
UserDaoImpl
的實現(xiàn)類代碼如下:
@Repository
public class UserDaoImpl implements UserDao {
public void saveUser() {
System.out.println("執(zhí)行dao的保存方法");
}
}
注意事項: 由于我們是基于注解的方式實現(xiàn)對 bean 的管理,所以在實現(xiàn)類上面需要添加一個注解 @Repository,此注解的作用是為了 Spring 的容器啟動后,
需要要自動檢測這些被注解的類并注冊相應(yīng)的 bean 實例到容器中。
Spring 的核心配置文件:
<?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:component-scan base-package="com.wyan.dao"></context:component-scan>
</beans>
上面是本案例的配置文件,那么可以看出跟 xml 的配置文件有很大的區(qū)別:
?配置節(jié)點:context-component-scan
標(biāo)簽,這是 Spring 框架自定義的 xml 標(biāo)簽,通過 base-package
的屬性,指明需要被自動掃描實例化的類所在位置。
如上圖所示,我們在 com.wyan.dao 下的類是需要掃描自動注入容器的。
小細節(jié):不是在 com.wyan.dao 下的所有類都會自動注入到容器,而是要搭配注解:比如我們的 @Repository 當(dāng)然還有其余的注解,我們后面章節(jié)會詳細講解。
測試類測試結(jié)果:
代碼解釋:
測試類其實跟 xml 的方式一模一樣,我們本次測試的目的一樣也是通過 Spring 容器管理注冊的 bean 對象,只不過對象的實例化方式換成了注解,那么我們看到成功輸出在控制臺的測試語句,說明案例搭建完成。
3. 小結(jié)
本節(jié)帶著大家使用注解的方式,實現(xiàn)了 Spring 對于 bean 的管理。
那么回顧下注解開發(fā)的步驟和注意點:
- Spring 容器初始化一樣需要 xml 文件,目前是 xml 文件搭配注解管理 bean 并不是純注解開發(fā);
- Spring 的 xml 配置文件中使用
context:component-scan
標(biāo)簽指定注冊 bean 的類所在目錄位置; - 自定義編寫的 Java 類,如果需要被自動掃描注入容器,必須搭配注解。
學(xué)習(xí)的苦只是一時之苦,學(xué)不到的苦是一世之苦,與君共勉…