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配置初始化和销毁的我方法,在这些方法中完成需要的功能. 实验: 通过断点调试模式,测试初始化方法和销毁方法的执行 ...
随机推荐
- 逆向 string.h 函数库 strlen、memchr、strcat 函数
strlen 函数 主要功能:返回字符串的长度 C/C++ 实现: #include <iostream> #include <stdio.h> #include <st ...
- Win64 驱动内核编程-7.内核里操作进程
在内核里操作进程 在内核里操作进程,相信是很多对 WINDOWS 内核编程感兴趣的朋友第一个学习的知识点.但在这里,我要让大家失望了,在内核里操作进程没什么特别的,就标准方法而言,还是调用那几个和进程 ...
- Instagram 为什么不用redis
Hi 我还是大粽子 碎碎念 让我比较兴奋的就是这段时间的文章,被感兴趣的同学一一关注,关注量上涨就是我的最大动力. 我每周都会输出至少3篇原创文章,希望能被更多的同学关注,点赞,在看,形成习惯. In ...
- 04.06 UCF Local Programming Contest 2017
A.Electric Bill 题意:简单计算题,超过1000部分额外算 1 #include<stdio.h> 2 int main(){ 3 int money1,money2; 4 ...
- x265编码命令
CQP: #/bin/bash ./x265 --input FourPeople_1280x720_60.yuv --input-res 1280x720 --fps 60 --qp 40 --fr ...
- Introduction to x265 Rate Control Algorithm
The rate control in x265 is the same as x264's implementation, which is mostly empirical. It include ...
- SpringBoot整合shiro系列-SpingBoot是如何将shiroFilter注册到servlet容器中的
一.先从配置类入手,主要是@Bean了一个ShiroFilterFactoryBean: @Data @Configuration @Slf4j @EnableConfigurationPropert ...
- Markdown使用概述
Markdown使用概述 序言 作为一名编程学习的爱好者和初学者,由于学习编程的过程中总是存在遗忘以及很难动手写起来的问题,所以在看了许多关于编程学习方法的文章之后,选择使用typora作为我的笔记工 ...
- [DB] Spark Core (2)
RDD WordCount处理流程 sc.textFile("/root/temp/data.txt").flatMap(_.split(" ")).map(( ...
- [c++] 常犯错误
更改变量值时想清楚对后面程序的影响 scnaf & == 数组下标从0开始 不赋初值导致的垃圾数据 全局flag和局部flag