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方法,就可以让程序的主动权从程序员手中移交到用户手中,用户想用什么就传什么参数就好了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值