【Spring】IOC思想前导
UserDao接口
package com.wang.dao; public interface UserDao { public void getUser(); }
UserDaoImpl实现类
public class UserDaoImpl implements UserDao { @Override public void getUser() { System.out.println("UserDao找到了指定用户"); } }
UserService接口
public interface UserService { public void getUser(); }
UserServiceImpl实现类
public class UserServiceImpl implements UserService { @Override
private UserDao dao=new UserDaoImpl();
public void getUser() { dao.getUser(); } }
在Service层,service通过组合模式将userDao接口来获取接口实现类,然后通过调用实现类的getUser方法 来实现service实现类的getUser方法
public class Test01 { @Test public void test_ioc_01(){ UserServiceImpl service = new UserServiceImpl(); service.getUser(); }
}
用户通过调用service实现类UserService的getUser方法来获取用户
此时用户想要通过MySQL数据库,或者Oracle数据库来获取用户
为此,我们需要创建对应UserDao实现类,并且修改UserService中的私有变量的指向
public class UserDaoMysqlImpl implements UserDao { @Override public void getUser() { System.out.println("通过MYSQL数据库找到了指定用户"); } }
修改UserServiceImpl类中局部变量dao的指向
private UserDao dao=new UserDaoMysqlImpl();
test调用结果
通过MYSQL数据库找到了指定用户
进程已结束,退出代码为 0
如果我们想要修改通过Oracle或者其他方式获取用户,我们不仅需要创建相应UserDao接口实现类,并且要手动修改UserService实现类中局部变量dao的指向。
当用户的需求不断变化时,需要程序员手动修改dao的指向
,明显增加了大量无用的操作,浪费时间浪费精力。
怎样才能做的更好,更懒,是我们的发展动力
看一下下面的操作
public class UserServiceImpl implements UserService { private UserDao dao; public void setDao(UserDao dao){ this.dao=dao; } @Override public void getUser() { dao.getUser(); } }
我们对dao的相关初始化进行了修改,我们通过暴露setDao方法,可以使得用户更改dao指向的实现类,这样就不需要程序员手动去修改dao的实现类了,实现了解耦合,我们可以通过单元测试 测试一下
@Test public void test_ioc_02(){ UserServiceImpl service = new UserServiceImpl(); service.setDao(new UserDaoMysqlImpl()); service.getUser(); service.setDao(new UserDaoOracleImpl()); service.getUser(); }
//通过MYSQL数据库找到了指定用户
//通过Oracle数据库找到了指定用户
//进程已结束,退出代码为 0
根据上面的例子我们可以发现:
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们根据用户的需求去修改原代码!
如果程序的代码量十分大,修改一次的成本代价十分昂贵!
我们使用一个Set接口实现,已经发生了革命性的变化!
private UserDao dao; public void setDao(UserDao dao){ this.dao=dao; }
- 之前,程序是主动创建对象,控制权在程序员手上!
- 使用了set注入后,程序不在具有主动性,而是变成了被动接受对象
这种思想,从本质上解决了问题,程序员不用再去管理对象的创建了,系统的耦合性大大降低了,可以更加专注的在业务的实现上!
通过了接口的调用。Dao层和Service层实现了解耦合
IOC的本质:
控制反转(Ioc)(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方式,也有人认为DI只是IOC的另一种说法。没有IOC的程序中,我们使用
面向对象编程,对象的创建和对象间的依赖关系硬编码在程序中,对象的创建有程序自己控制,控制反转后对象的创建转移给了第三方,个人认为所谓的控制反装
就是获得依赖对象的方式反转了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!