使用 intellijIDEA 創建 maven 工程進行 Spring ioc 測試
使用 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 測試