您的「關注」和「點贊」,是信任,是承認,是支持,是動力......html
如意見相佐,可留言。
本人必將不遺餘力試圖作到準確和全面,終其一輩子進行修改補充更新。web
經過具體實例演示 IoC 容器的使用,步驟以下所示。
本文使用的開發工具爲:spring
Eclipse IDE for Enterprise Java Developers. Version: 2018-12 (4.10.0) Build id: 20181214-0600
工程項目是基礎。在 Eclipse 中建立 Web 項目spring-demo
。apache
將 Spring 框架所需的 JAR 包複製到項目的 lib 目錄中,並將其添加到類路徑下(選中每一個 jar 包 → 右鍵 → Build Path → Add to Build Path),添加後的項目以下圖所示:
微信
建立交給 Spring 來實例化的實現類。一般先建立 Dao 接口,再建立 Dao 接口的實現類。app
(1)先建立 Dao 接口框架
在項目的 src
目錄下建立一個名爲 com.manongajie.dao
的包,在該包中建立一個名爲 UserDao
的接口,並在接口中添加一個 add() 抽象方法,以下所示:eclipse
package com.manongajie.dao; /** * Dao 接口(演示用) * * @author manongajie * */ public interface UserDao { public void add(); }
(2)建立 Dao 接口的實現類 UserDaoImpl
webapp
在 com.manongajie.ioc
包下建立 UserDao
的實現類 UserDaoImpl
,代碼以下所示:ide
package com.manongajie.ioc; import com.manongajie.dao.UserDao; public class UserDaoImpl implements UserDao { @Override public void add() { // TODO Auto-generated method stub System.out.println("添加了一個 user 。"); } }
Spring 自己是基於 xml 配置來工做的,在使用 Spring 的過程當中不可避免的要編寫大量 xml 配置,Spring 官方提供了這些 xml 文件的編寫規範,這是經過提供 xml 的約束文件來實現的。
簡單理解, xml 的約束實際上是一種限定 xml 文件寫法的技術,主要分爲兩種:
.dtd
。.xsd
。Spring 提供了 Schema 格式的約束,來限定 Spring 配置文件的寫法。
開發者能夠經過閱讀 Spring 提供的約束文件來了解 Sprinig 的 xml 配置的寫法。
可是,這麼整的話會很麻煩,因此,一般咱們會將約束文件交給開發工具管理(本文用的是 Eclipse),開發工具能夠經過解析約束文件瞭解 xml 的寫法,並在須要時爲開發者提供標籤提示。
如何將 Spring 的約束文件(這裏只整 Spring beans 的約束文件)交給 Eclipse 來管理呢?
請參見如下步驟,
(1)找到 Spring 的約束文件,路徑爲:\spring-5.2.6.RELEASE-dist\spring-framework-5.2.6.RELEASE\schema\beans
。一步步打開存放 Spring 框架的目錄spring-framework-5.2.6.RELEASE
,以下圖所示:
打開此目錄,以下圖所示:
再打開schema
目錄,以下圖所示:
再打開beans
目錄,就找到 Spring beans 約束文件了。以下圖所示:
(2)打開 Eclipse 的 /Window/Preferences
,配置其中的XML Catalog
,以下圖所示:
找到上圖中的 ③ 按鈕「Add」
,點擊在新彈出的選項卡中導入上一步找到的spring-beans.xsd
文件,並設置好名稱空間,一般是在自動識別的名稱空間以後再加上/文件名
(/spring-beans.xsd
),點擊OK
便可。以下圖所示:
xml 文件模版代碼,能夠去官網獲取,不一樣版本的 Spring 框架,配置文件頭約束的寫法是不一樣的,建議去官網獲取。以下所示(spring 5.2.6 版本):
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions go here --> </beans>
因爲 Eclipse 不會自動生成如上所示的 xml 文件(至少本人所安裝的 Eclipse 沒有自動生成),須要手動敲寫代碼,能夠看出來,通常人真記不住,得複製粘貼,比較麻煩。常常要用到的話,仍是配置一個 xml 模版比較好,能夠快速生成 所需的 xml 文件。
配置 xml 模版步驟以下所示:
(1)在 Eclipse 中的/Window/Preferences
中配置新模版,以下圖所示:
(2)點擊New
按鈕,進入到New Template
選項框中,進行設置模版,所有搞定以後,點擊OK
便可。以下圖所示:
在 src
目錄下建立 Spring 的核心配置文件 applicationContext.xml
(這個 xml 文件名是能夠自定義的),以下圖所示:
選中咱們提早建立好的模版,肯定以後,以下圖所示:
applicationContext.xml
配置文件建立好以後,就能夠寫配置了,以下代碼所示:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 2 到 5 行是 Spring 的約束配置 --> <!-- 由 Spring 容器建立該類的實例對象:bean spring 管理的類都稱爲 bean id 表示文件的惟一標識,不能重複,「駝峯命名法」首字母小寫; class 表示指定須要實例化的 Bean 的全限定類名(包名+類名)。 --> <bean id="userDaoImpl" class="com.manongajie.ioc.UserDaoImpl"></bean> <!-- 還能夠設置別名標籤:經過 IoC 容器獲取 userDao 實例。applicationContext.getBean("user") --> <alias name="userDaoImpl" alias="user"></alias> </beans>
在 com.manongajie.test
包下建立測試類 SpringTest1
,並在該類中添加一個名爲 test1()
的方法,代碼以下所示:
package com.manongajie.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.manongajie.dao.UserDao; public class SpringTest1 { @Test public void test1() { // 定義Spring配置文件的路徑 String xmlPath = "applicationContext.xml"; // 初始化 Spring 容器,加載配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath); // 經過 IoC 容器獲取 userDao 實例。applicationContext.getBean(id) //UserDao userDaoImpl = (UserDao) applicationContext.getBean("userDaoImpl"); // 經過 IoC 容器獲取 userDao 實例。applicationContext.getBean(全限定類名.class) UserDao userDaoImpl = (UserDao) applicationContext.getBean(com.manongajie.ioc.UserDaoImpl.class); // 別名標籤:經過 IoC 容器獲取 userDao 實例。applicationContext.getBean("user") // UserDao userDaoImpl = (UserDao) applicationContext.getBean("user"); // 調用 UserDao 的 add() 方法 userDaoImpl.add(); } }
運行結果(使用 JUnit 測試運行 test1() 方法,運行成功後,控制檯的輸出結果):
添加了一個 user 。
由以上代碼能夠看出,在程序執行時,對象的建立並非經過 new
一個類完成的,而是由 Spring 容器管理實現的。這就是 Spring IoC 容器思想的工做機制。