Spring IoC学习之基于XML的IoC

这里实现一下基于XML方式的IoC,这里没有过多的理论,全是实际操作。

废话不多说,直接写代码。

这里用的IDE是IDEA,用maven构建的项目,如果不会的依赖直接用jar包也行。先看项目结构和依赖。

这是项目结构使用maven构建的,如果不会直接构建简单的java web项目手动创建包,然后下载相关jar包一样可以实现的哦。

Spring IoC学习之基于XML的IoC

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的信息了。相当于对数据库做查询操作。

测试结果:

Spring IoC学习之基于XML的IoC好吧。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();
    }

测试结果:Spring IoC学习之基于XML的IoC到这里基于XML的IoC基本的操作就完成啦啦啦啦啦。