在一个普通的项目中会设计Dao层、Service层。Dao层主要做数据持久层的工作,负责与数据库进行交互的工作都封装在此,在该层首先定义接口类,然后定义实现类。Service层主要负责业务模块的设计,同样先设计接口,然后定于实现类,在Service层的业务中,都要调用Dao层定义的接口。
在Dao层定义的接口
package xyz.bryce.dao;
public interface userDao {
public void getUser();
}
Dao定义的实现类
package xyz.bryce.dao;
public class userDaoImpl implements userDao {
@Override
public void getUser() {
System.out.println("输出用户信息");
}
}
Service层定义的接口
package xyz.bryce.service;
public interface userService {
public void getUser1();
}
Service层定义的实现类,在Service层的具体业务中调用Dao层的功能。
package xyz.bryce.service;
import xyz.bryce.dao.userDao;
import xyz.bryce.dao.userDaoImpl;
public class userServiceImpl implements userService {
private userDao user = new userDaoImpl();
@Override
public void getUser1() {
user.getUser();
}
}
在测试上面userServiceImpl
类时,输出获取用户信息
。
当在Dao层再增加一个Dao接口的实现类如下:
package xyz.bryce.dao;
public class userDaoStuImpl implements userDao{
@Override
public void getUser() {
System.out.println("获取学生信息");
}
}
然后在Service层中使用该新增类时,就要更改对应类:
package xyz.bryce.service;
import xyz.bryce.dao.userDao;
import xyz.bryce.dao.userDaoImpl;
public class userServiceImpl implements userService {
private userDao user = new userDaoStuImpl(); //private userDao user = new userDaoStuImpl();
@Override
public void getUser1() {
user.getUser();
}
}
测试该类时,输出获取学生信息
。
可以看到,每在Dao层增加一个新的实现类的时候,就要相应的在Service层改源码。模块之间的耦合性较高。
更改一下Service层实现类
public class userServiceImpl implements userService {
private userDao user;
public void setUser(userDao user) {
this.user = user;
}
@Override
public void getUser1() {
user.getUser();
}
}
原来的实现类直接将要处理的那个Dao层中的业务限制不变,而现在通过改用set方法,具体使用Dao层中的哪个实现类目前也不确定,只能通过其他程序调用该类时通过传参确定,被动的接受对象。程序被动的获取对象,而不需要主动的new对象。这就是IOC的原型。