1. 程式人生 > >使用 intellijIDEA 創建 maven 工程進行 Spring ioc 測試

使用 intellijIDEA 創建 maven 工程進行 Spring ioc 測試

rgs sca .class 名稱 artifact chang classpath 其中 spa

使用 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 測試