標籤:通過 ESS 設定 配置 運行 spring value 開啟 類型
使用 intellijIDEA 建立 maven 工程進行 Spring ioc 測試ioc 概念
控制反轉(Inversion of Control,縮寫為IOC),是物件導向編程中的一種設計原則,可以用來減低電腦代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI)。通過控制反轉,對象在被建立的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。
IOC和DI區別
- IOC: 控制反轉,把對象建立交給spring進行配置
- DI: 依賴注入,向類裡面的屬性中設定值
- 關係:依賴注入不能單獨存在,需要在ioc基礎之上完成操作
建立 spring 執行個體進行 ioc 測試
我們使用 intellijIDEA 來完成這一操作,首先建立 maven 工程(maven提供了 java 中 jar 包的下載管理,方便我們使用下載和匯入 jar 包,推薦使用)。開啟 idea,選擇 Create New Project, 在彈出來的視窗中選擇建立 maven 工程,設定好 JDK 後點擊 next 進行下一步。
設定好 GrouId、ArtifactId、Version 後,按提示一路設定建立好 maven 項目。
我們修改 pom.xml 設定,配置需要添加下載的 jar 包:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
當我們修改pom.xml 檔案時,idea 會提示我們匯入,我們點擊 Import Change即可,當然也可以設定Auto-Import自動匯入:
我們在 src/main/java 下建立一個 package:cn.itcast.ioc, 並在 package 下建立 User.java:
package cn.itcast.ioc;public class User { public void add(){ System.out.println("add......"); } //public static void main(String[] args) { //原始做法 //User user = new User(); //user.add(); //}}
在 resources目錄下建立 applicationContext.xml 設定檔:
<?xml version="1.0" encoding="UTF-8"?><!-- scheme約束 --><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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- ioc 入門 --> <bean id="user" class="cn.itcast.ioc.User"></bean></beans>
然後在 src/main/java 下建立測試檔案 TestIOC.java ,嘗試能否通過裝載 bean,交由 spring 建立對象,通過設定檔輸出 ioc 執行個體:
package cn.itcast.ioc;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestIOC { @Test public void testUser(){ //1.載入 spring 設定檔,根據建立對象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.得到配置建立的對象 User user = (User) context.getBean("user"); user.add(); }}
運行 TestIOC.java , 若控制台能輸出 add() 方法,便測試成功。
通過設定檔注入屬性
介紹:建立對象時候,向類裡面屬性設定值。
在 spring 中我們一般採用通過set 方法注入。
舉個栗子:
在 src/main/java/ 下建立 UserService.java:
package cn.itcast.ioc;public class UserService { //1 定義 user 類型 private User user; //2 產生set 方法 public void setUser(User user) { this.user = user; } public void add(){ System.out.println("service...."); user.add(); }}
修改 applicationContext.xml 檔案:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 注入物件類型 --> <!-- 配置 service 和 user 對象 --> <bean id="user" class="cn.itcast.ioc.User"></bean> <bean id="userService" class="cn.itcast.ioc.UserService"> <!-- 注入 user 對象 name 屬性值, service 類裡面的屬性名稱 ref 屬性, 配置bean 標籤中 id 值 --> <property name="user" ref="user"></property> </bean></beans>
修改 TestIOC.java:
package cn.itcast.ioc;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestIOC { @Test public void testUser(){ //1.載入 spring 設定檔,根據建立對象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.得到配置建立的對象 UserService userService = (UserService) context.getBean("userService"); userService.add(); }}
成功在控制台輸出 UserService類的 add() 方法和注入的屬性:
通過註解建立 ioc 執行個體
上述執行個體是通過配置 xml 檔案來實現建立對象的功能,spring 也提供了另一種方式來實現上述功能:註解。
註解介紹
- 代碼裡面特殊標記,使用註解可以完成功能
- 註解寫法 @註解名稱(屬性名稱=屬性值)
- 註解使用在類上面,方法上面和屬性上面
建立對象的四個註解
- @Component
- @Controller
- @Service
- @Repository
主要是通過 Component 衍生出 其他三個在web 層、業務層、持久層註解,主要是為了後續增強。但對我來說這四個註解功能目前來說是一樣的,都是建立對象。
我們重新設定一下 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" 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"> <!-- bean definitions here --> <!-- 開啟註解掃描 (1) 到包裡面掃描類,方法,屬性上面是否有註解 --> <context:component-scan base-package="cn.itcast.ioc"></context:component-scan> <!-- 掃描屬性上面的註解 --> <!--<context:annotation-config></context:annotation-config>--></beans>
修改 User.java 檔案:
package cn.itcast.ioc;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;@Service(value = "user") //相當於<bean id="user" class=""/>@Scope(value = "prototype") //多執行個體public class User { public void add(){ System.out.println("add........"); }}
修改TestIOC.java:
package cn.itcast.ioc;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestIOC { @Test public void testUser(){ //1.載入 spring 設定檔,根據建立對象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.得到配置建立的對象,這裡的getBean()方法中的 user 為User類通過註解的 value 值。 User user = (User) context.getBean("user"); user.add(); }}
控制台成功輸入User 類的 add()方法:
通過註解注入屬性
同樣的,我們可以通過使用註解注入屬性。
這裡有兩種方式,我們可以通過使用 @Autowired(自動注入)或 @Resource(name="value")(name屬性值:註解建立對象 value 值),推薦使用後一種。
註:使用註解不需要 set 方法。
還是舉個栗子:
在 src/main/java/ 下建立 package 和 UserDao.java 和 UserService.java。
UserDao.java:
package cn.itcast.anno;import org.springframework.stereotype.Service;@Service(value = "userDao")public class UserDao { public void add(){ System.out.println("dao........."); }}
UserService.java:
package cn.itcast.anno;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import javax.annotation.Resource;@Service(value = "userService")public class UserService { //得到dao 對象 //定義 dao 類型 //方法一:在 dao屬性上面使用註解,完成對象注入// @Autowired// private UserDao userDao; //使用註解不需要set 方法 //方法二: //name屬性值: 註解建立 dao對象 value 值 @Resource(name = "userDao") private UserDao userDao; public void add(){ System.out.println("service......."); userDao.add(); }}
使用上述 applicationContext.xml 中的註解配置,建立 TestAnno.java:
package cn.itcast.anno;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestAnno { @Test public void TestService(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService) context.getBean("userService"); userService.add(); }}
運行 TestAnno.java ,控制台輸出如下資訊:
總結:
- 通過 spring架構的 ioc 容器,我們可以把對象的建立交給 spring 進行,降低代碼的耦合度。
- 使用 spring 架構 ioc 容器,可以通過配置 xml 檔案和註解兩種方式進行管理。
- 掌握注入屬性的兩種方式:配置 xml 檔案和註解。
- 先建立對象,再注入屬性。
使用 intellijIDEA 建立 maven 工程進行 Spring ioc 測試