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基本的操作就完成啦啦啦啦啦。