Spring 控制反转 Ioc 的理论推导

暂且不看Ioc

按照以前开发的套路,先写一个小例子:

新建一个项目,创建com.wzq.dao包,写一个UserDao接口:

package com.wzq.dao;

public interface UserDao {
    
    
    void getUser();
}

在此包下新建一个默认的实现类,输出一句话

package com.wzq.dao;

public class UserDaoImpl implements UserDao{
    
    
    public void getUser() {
    
    
        System.out.println("正在使用默认方式读取User...");
    }
}

现在创建com.wzq.service包,写一个接口:

package com.wzq.service;

public interface UserService {
    
    
    void getUser();
}

新建实现类:

package com.wzq.service;

import com.wzq.dao.UserDao;
import com.wzq.dao.UserDaoImpl;

public class UserServiceImpl implements UserService {
    
    
    private UserDao dao = new UserDaoImpl();
    
    public void getUser() {
    
    
        dao.getUser();
    }
}

测试:

import com.wzq.service.UserService;
import com.wzq.service.UserServiceImpl;
import org.junit.Test;

public class MyTest {
    
    
    @Test
    public void Test1(){
    
    
        UserService service = new UserServiceImpl();
        service.getUser();
    }
}

输出结果:
在这里插入图片描述
如果现在用户不想用默认方式获取数据,想用MySql获取数据咋办?按照以前的套路肯定是再创建一个MySql关于UserDao接口的实现类喽:

package com.wzq.dao;

public class UserDaoMySqlImpl implements UserDao {
    
    
    public void getUser() {
    
    
        System.out.println("正在使用MySQL读取User...");
    }
}

然后再在UserServiceImpl实现类中更改获取的对象,最后测试:
在这里插入图片描述
成功了,那如果说:用户现在想用Sql Server呢,继续加呗,继续改service呗,那如果用户想用oracle呢?继续加呗,继续改service呗……那如果用户想…………………………好了打死用户吧!!!

总而言之,用这样的方式,每次都需要修改service层的代码,好麻烦,所以为了解决这个问题,可以在UserServiceImpl中加一个set方法:

//利用set进行动态实现值的注入!
public void setUserDao(UserDao dao) {
    
    
    this.dao = dao;
}

现在测试的时候,只需要调用这个方法传递想要用的dao层实现类即可:

@Test
public void Test1(){
    
    
    UserService service = new UserServiceImpl();
    ((UserServiceImpl) service).setUserDao(new UserDaoMySqlImpl());
    service.getUser();
}

在这里插入图片描述
这就是控制反转Ioc的思想!通过在service层设置一个set方法,就可以让程序的主动权从程序员手中移交到用户手中,用户想用什么就传什么参数就好了!

猜你喜欢

转载自blog.csdn.net/lesileqin/article/details/113405741