1. 程式人生 > >Spring IoC學習之基於XML的IoC

Spring IoC學習之基於XML的IoC

這裡實現一下基於XML方式的IoC,這裡沒有過多的理論,全是實際操作。

廢話不多說,直接寫程式碼。

這裡用的IDE是IDEA,用maven構建的專案,如果不會的依賴直接用jar包也行。先看專案結構和依賴。

這是專案結構使用maven構建的,如果不會直接構建簡單的java web專案手動建立包,然後下載相關jar包一樣可以實現的哦。

Pom檔案直接貼程式碼吧。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yijia</groupId>
    <artifactId>spring_ioc_xml</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>spring_ioc_xml</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring.version>4.3.13.RELEASE</spring.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.13.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.3.13.RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>

    </build>
</project>

嗯。。。程式碼到了關鍵部分在講吧,其他都直接按照開發順序貼程式碼了哈。

首先在model包下面新建User類:User.java。只有id和username兩個欄位。並生成get set方法以及toString方法。

public class User {
    private int id;
    private String username;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public User() {
    }

    public User(int id, String username) {
        super();
        this.id = id;
        this.username = username;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + "]";
    }


}

然後在dao包下面新建介面IUserDao.java。

嗯。。。命名按照個人喜好哈,不過我還是喜歡將介面命名為UserDao,然後實現類命名為UserDaoImpl。 

 IUserDao.java 這裡只貼了一個方法,因為最後測試的時候只測試了add方法,不過其他方法都是類似的呀,學會一個,那其他也掌握了呀。

public interface IUserDao {

    public void add(User user);

}

然後是 IUserDao.java的實現類UserDao.java這裡模擬新增使用者的操作,直接向控制檯輸出新增的物件user就是,不直接操作資料庫了,如果有對操作資料庫的需求,這裡寫操作資料庫的邏輯就是。

public class UserDao implements IUserDao {

    public void add(User user) {
        System.out.println("add user:" + user);
    }

}

然後然後 就是service層啦,來到service包新建介面UserService.java

UserService.java

public interface UserService {
    public void add(User user);
}

繼續.....寫UserService.java介面的實現類UserServiceImpl,java

UserServiceImpl,java

//這裡需要匯入IUserDao和User的包
public class UserServiceImpl implements UserService {

    //引入IUserDao
    private IUserDao userDao;

    //userDao的get方法
    public IUserDao getUserDao() {
        return userDao;
    }

    //userDao的set方法
    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }

    //實現介面的add方法,呼叫Dao的add方法
    public void add(User user) {
        userDao.add(user);
    }

}

由於所有的程式碼都沒有package,所有導包的程式碼在所有程式碼都沒有哦。。根據程式碼實際的的位置自己導包吧。

寫完service就是最後一層controller層了。

需要匯入User和UserService的包

UserController.java 

//同樣需要匯入User和UserService的包
public class UserController {

    private User user;
    private UserService userService;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    //這裡才是新增使用者的程式碼哦,呼叫service層的add方法
    public void add() {
        userService.add(user);
    }

}

java程式碼寫的差不多啦,然後就是beans.xml配置檔案啦。這裡很多解釋都解除安裝程式碼註釋裡面啦。

beans.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
        http://www.springframework.org/schema/beans/spring-beans.xsd
        ">
  
    <!--
    這裡採用的是屬性注入
    id就是獲取bean的例項物件名,相當於平常使用new方法獲取物件的變數名
    class對應User類的包名 也就是類的全限定名
    下面的兩個property標籤對應類的兩個屬性
    name對應屬性名
    value就是屬性的值
    -->
    <bean id="user" class="com.yijia.spring_ioc_xml.model.User">
        <property name="id" value="2"></property>
        <property name="username" value="我是使用者名稱"></property>
    </bean>
    <bean id="userDao" class="com.yijia.spring_ioc_xml.dao.UserDao"></bean>
    <bean id="userService" class="com.yijia.spring_ioc_xml.service.UserServiceImpl">
        <!--
        name中的值會在userService物件中呼叫setXX方法來注入,諸如:name="userDao"
        在具體注入時會呼叫setUserDao(IUserDao userDao)來完成注入
        ref="userDao"表示是配置檔案中的bean中所建立的Dao的id
        -->
        <property name="userDao" ref="userDao"></property>
    </bean>

    <!--
    scope="singleton"意思是該bean的作用範圍是單例的,每次獲取bean的時候都是同一個
    -->
    <bean id="userController"
          class="com.yijia.spring_ioc_xml.controller.UserController" scope="singleton">
        <property name="userService" ref="userService"></property>
        <property name="user" ref="user"></property>
    </bean>
</beans>

最後最後,當然要測試一下我們寫的程式碼啦。

寫一個測試類 ,UserController的包需要自己匯入

TestSpring.java
import org.springframework.beans.factory.BeanFactory;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class TestSpring {

    //建立spring的工廠
    BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");


    @Test
    public void testUser() {
        UserController userController = factory.getBean("userController", UserController.class);
        System.out.println(userController.getUser());

    }
}

通過ClassPathXmlApplicationContext傳入beans.xml檔名返回BeanFactory物件。

然後通過BeanFactory物件的getBean方法傳入bean的id:userController,也就是bean的名字返回一個UserController物件

由於在beans.xml中使用屬性注入的方法為user注入了值,所以這裡直接使用getUser方法就可以獲取到user的資訊了。相當於歲資料庫做查詢操作。

測試結果:

好吧。add方法沒有測試 

那麼就測試一下吧。新增測試方法:

    @Test
    public void testAdd(){
        //getBean的兩種方式都可以,只是前一種需要強制轉換一下
        User user = (User) factory.getBean("user");
        UserController userController = factory.getBean("userController", UserController.class);

        //對user手動賦值
        user.setId(2);
        user.setUsername("add方法測試");

        //手動注入user
        userController.setUser(user);
        userController.add();
    }

測試結果:到這裡基於XML的IoC基本的操作就完成啦啦啦啦啦。