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配置初始化和销毁的我方法,在这些方法中完成需要的功能. 实验: 通过断点调试模式,测试初始化方法和销毁方法的执行 ...
随机推荐
- UVA11054Gergovia的酒交易
题意: 有n个村庄,每个村庄要么买酒要么买酒,负数是买酒,整数是买酒,题目保证所有的数字想加和为0,保证有解,然后每一个村庄往相邻的村庄运k坛酒的花费是k,问满足所有的村庄的最小花费是多少 ...
- 逆向 time.h 函数库 time、gmtime 函数
0x01 time 函数 函数原型:time_t time(time_t *t) 函数功能:返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位.如果 se ...
- 16.PHP_Ajax模拟服务器登录验证
Ajax模拟登陆验证 index.php <script language="javascript"> var http_request = false; ...
- Android开机时间分析
http://blog.csdn.net/huangyabin001/article/details/42777703
- 利用cm压缩包手动安装cm和cdh
安装准备: 1.操作系统为centos6.9 CentOS-6.9-x86_64-bin-DVD1to2 2.安装Oracle JDK (1.8u121) 下载jdk-8u121-linux-x64. ...
- spring mvc简单使用
spring mvc pom.xml依赖与插件 导入servlet.springmvc.Jackson的依赖,编译插件.tomcat <?xml version="1.0" ...
- 【Spring浅析】一、 BeanFactory 有啥可说的?
阅读 Spring 源码,BeanFactory 是避不了的存在.而大家常见的使用场景,也是以下形式: ConfigurableApplicationContext ctx = SpringAppli ...
- web自动化框架—BasePage 类的简单封装
优秀的框架都有属于自己的思想,在搭建web自动化测试框架时,我们通常都遵循 PO(Page Object)思想. 简单理解就是我们会把每个页面看成一个对象,一切皆对象,面向对象编码,这样会让我们更好的 ...
- x小结:certutil -hashfile D:\1.exe MD5
在Win7上,MD5不要使用小写,在Win10上没有这个问题 x小结:certutil -hashfile D:\1.exe MD5certutil -hashfile D:\1.exe SHA1ce ...
- 微信收藏了很多语音,有一些比较有意义的,但是发现只能收藏在微信,没有办法导出了,请大神看清楚,是微信【收藏】的语音,ios或者安卓的方法都可以