第一步:我们试着写一个简单的例子
dao层我们写接口和实现类
public interface UserDao {
?
void getName();
}
public class UserDaoImpl implements UserDao {
service层我们也写接口和实现类
public interface UserService {
?
void getName();
}
public class UserServiceImpl implements UserService {
private UserDao userDao=new UserDaoImpl();
?
再写一个测试类
public class TestIOC {
?
public static void main(String[] args) {
UserService userService=new UserServiceImpl();
userService.getName();
}
}
此时我们调用userService的方法由于service层调用了dao层我们会执行getName方法并且输出数据到控制台。
试想一下,假如我们需要增加一个学生对象呢?
我们第一步是需要在dao层写dao学生实现类去实现dao层接口
然后还要在service层实现类修改初始化的dao实例对象
这样子是不是耦合度太高了呢????
我只是在dao新增一个对象,我却要改全局的代码,试想一下如果逻辑业务多,是否是一个耗时耗力,成本十分高的工作呢?
因此我们能不能在service层一次性初始化完,之后我们不论要新增什么对象,都不需要动service层代码,把控制管理权给别人,自己被动调用,在需要的时候直接调用就行。
我们于是将直接初始化改成set注入
public class UserServiceImpl implements UserService {
private UserDao userDao;
?
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
?
再看看现在的实现类写法
public static void main(String[] args) {
UserServiceImpl userService=new UserServiceImpl();
userService.setUserDao(new StudentDaoImpl());
userService.getName();
?
}
会发现此时我们有新的需求,需要创建新的对象我们不需要再去动service层,而只需要在调用的时候实例化这个对象,并且执行他里面的方法就能获取到数据。
总结:是不是通过set注入减少了开发成本的同时,实现了代码的松耦合呢,将主动权给到用户方,我们并不需要改动原有架构,其实这就是IOC的原型,控制反转
原文:https://www.cnblogs.com/xuan-study/p/13325319.html