Spring IOC(控制反转)思想笔记
Spring IOC(控制反转)思想笔记
IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码。

案例
如果按照之前javaweb的固定方法,写一个简单的业务逻辑
一个DAO接口
public interface UserDao {
public void getUser();
}
- 1
- 2
- 3
实现DAO接口
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("获取用户数据");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
一个service接口
public interface UserService {
public void getUser();
}
- 1
- 2
- 3
实现service接口
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl(); @Override
public void getUser() {
userDao.getUser();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
测试类
@Test
public void test(){
UserService service = new UserServiceImpl();
service.getUser();
}
- 1
- 2
- 3
- 4
- 5
这些是原来方式编写的基本步骤,如果现在增加需求,在UserServiceImpl中不是需要UserDaoImpl,而是一个新的实现了UserDao接口的UserDaoMySqlImpl
新增UserDaoMySqlImpl实现UserDao接口
public class UserDaoMySqlImpl implements UserDao {
@Override
public void getUser() {
System.out.println("MySql获取用户数据");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
如果要去使用这个UserDaoMySqlImpl的话,就需要在UserServiceImpl中修改代码
修改UserServiceImpl
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoMySqlImpl();//修改部分 @Override
public void getUser() {
userDao.getUser();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
如果再增加一个UserDaoOracleImpl
public class UserDaoOracleImpl implements UserDao {
@Override
public void getUser() {
System.out.println("Oracle获取用户数据");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
如果又要使用这个dao,则又需要去service中改变代码,假设项目十分庞大,修改一个dao可能涉及几十几百行代码,我们的工作量就会非常大,程序耦合性也非常高。
如何解决问题
在UserServiceImpl中增加一个set方法
public class UserServiceImpl implements UserService {
private UserDao userDao;
// 利用set方法,让调用者自行选择需要的dao
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
} @Override
public void getUser() {
userDao.getUser();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 新的测试类
@Test
public void test(){
UserServiceImpl service = new UserServiceImpl();
service.setUserDao( new UserDaoMySqlImpl() );//自行选择UserDaoMySqlImpl
service.getUser();
//如果又要用UserDaoOracleImpl,也是可以由调用者自行选择
//service.setUserDao( new UserDaoOracleImpl() );
//service.getUser();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
之前所有的改变都是有程序员去控制,现在将改变的主动权交给了调用者/用户,程序也不用去管怎么创建和调用了,使得程序员可以专心实现业务,只实现一个提供服务的接口,不再管理对象的创建,也降低了代码之间的耦合度,当需求改变时也不必修改大量代码
IOC思想
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。
控制反转:可以理解为控制 对象创建 的 主动权 反转了。原来对象创建要由我们编写的程序控制,主动权在程序手里,控制反转后就将创建对象的主动权移交给第三方,这样可以降低程序代码间的耦合性,减少了修改代码的工作量。



在Spring中,IOC思想的体现就是依赖注入,在xml文件中或者使用注解创建对象交由IOC容器管理,之后获取对象就不再通过new 对象,而是通过配置文件从IOC容器中获取对象,之后修改就不需要改动程序,而只需要在xml配置文件中进行修改 ,将对象交由Spring去创建、管理、装配。
原文章:https://blog.csdn.net/L_GRAND_ORDER/article/details/112136702
Spring IOC(控制反转)思想笔记的更多相关文章
- Spring IoC控制反转创建实例
Spring IoC控制反转创建实例写一个配置文件beans.xml,配置文件的约束可以访问:完整链接:https://repo.spring.io/libs-release-local/org/sp ...
- 学习Spring IOC控制反转和DI依赖注入总结
30岁的小曹,20岁的身体,还在坚持在能力允许控制范围内22点睡觉,5点起床锻炼身体,好好学习,除了加班或者像今天这样的深夜,再一次写已经有X百万人写过的 spring Ioc 的总结博客. 一.IO ...
- Spring IOC - 控制反转(依赖注入) - 入门案例 - 获取对象的方式 - 别名标签
1. IOC - 控制反转(依赖注入) 所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交 由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和生命周 ...
- [Spring]IOC控制反转和DI依赖注入
从之前算起到现在接触Spring也已经有几天了,进度也不是很快,就只弄懂了控制反转和依赖注入那么一点东西.然后敲了两个demo 主要是因为之前没有学过,然后网上资源很多但是都不是面向我们初学者的,大多 ...
- Spring IOC(控制反转)详解及示例
控制反转——Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象.你可以认为IoC与JN ...
- spring IOC --- 控制反转(依赖注入)----简单的实例
IoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的 ...
- 一) Spring 介绍、IOC控制反转思想与DI依赖注入
一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...
- Spring IOC - 控制反转(依赖注入) - 单例和多例
Spring容器管理的bean在默认情况下是单例的,即一个bean只会创建一个对象,存在map中,之后无论获取多少次该bean,都返回同一个对象. Spring默认采用单例方式,减少了对象的创建,从而 ...
- Spring IOC - 控制反转(依赖注入) - 配置初始化和销毁的方法
在Spring中如果某个bean在初始化之后,或销毁之前要做一些额外操作可以为该bean配置初始化和销毁的我方法,在这些方法中完成需要的功能. 实验: 通过断点调试模式,测试初始化方法和销毁方法的执行 ...
随机推荐
- 利用ICMP进行命令控制和隧道传输
目录 使用ICMP进行命令控制 使用ICMP搭建隧道 使用ICMP进行命令控制 攻击机:Kali 192.168.10.11 靶机:Windows 192.168.10.1 使用的工具:icmpsh ...
- 【JavaScript】【dp】Leetcode每日一题-解码方法
[JavaScript]Leetcode每日一题-解码方法 [题目描述] 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -& ...
- Day007 递归
递归 定义 A方法调A方法!就是自己调自己 作用 利用递归可以用简单的程序来解决一些复杂的问题.它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程 ...
- 去除腾讯视频logo水印
打开F12,然后再console中输入下面代码,即可. document.querySelectorAll(".txp_waterMark_pic").forEach(functi ...
- Maven执行Install命令时跳过测试
1. 在pom.xml中添加插件 <!-- 跳过单元测试,不然打包的时候会因为加载不了application.yaml报错 --> <plugin> <groupId&g ...
- PHP 通用格式化调试函数
/** * 打印调试函数 * @param $content * @param $is_die */function pre($content, $is_die = true){ header('Co ...
- 一种巧妙的使用 CSS 制作波浪效果的思路
在之前,我介绍过几种使用纯 CSS 实现波浪效果的方式,关于它们有两篇相关的文章: 纯 CSS 实现波浪效果! 巧用 CSS 实现酷炫的充电动画 本文将会再介绍另外一种使用 CSS 实现的波浪效果,思 ...
- qsort和sort学习与比较
阅读另一篇博文Uva 642 - Word Amalgamation sort qsort 1.qsort函数: 原 型: void qsort(void *base, int nelem, int ...
- [c++] 子类构造函数中有默认参数
子类创建对象时调用父类的构造函数: 1 #include <iostream> 2 using namespace std; 3 class Base 4 { 5 public: 6 Ba ...
- linux服务之NTP及chrony时间同步
博客园 首页 联系 管理 linux服务之NTP及chrony时间同步 一.NTP时间同步 NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步 ...