1、IOC理论推导

之前的传统做法,对象都是通过new出来的,如果需求变更,增加代码的同时需要去改动原有的代码,程序适应不了需求的变更。如果代码量大,修改的代价非常高。

举个简单的例子:一个获取用户信息的接口,有如下几个类

  1. UserDao
  2. UserDaoImpl
  3. UserServiceDao
  4. UserServiceDaoImpl

获取用户代码:
service中调用dao的方法

后面有需求变更,需要从MySQL和Oracle中获取用户,加了两个接口实现类

那么在调用的时候就得修改代码

为了解决这个问题,可以用set进行动态实现值的注入

在使用set方法之后,已经发生了革命性的变化!

  • 之前,程序是主动创建对象!控制权在程序猿手上!
  • 使用了set注入之后,程序不再具有主动性,而是变成了被动地接收对象

这种思想,从本质上解决了问题,程序猿不用再去管理对象的创建了。系统的耦合性大大降低,可以更加专注地在业务实现上。这是IOC的原型!

2、IOC本质

控制反转loc(lnversion Of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方法,也有人认为DI只是lOC的另一种说法。没有lOC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。

IOC是Spring框架的核心内容,使用多种方式完美的实现了IOC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IOC。

Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象。

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

通俗的话讲:用户访问的service(业务)层,逻辑代码都是在业务层,假如之前只有一个Mysql实现,现在要加一个Oracle实现,以及一些其他的实现,每加一种实现,用户用不着去改变什么,主动权在业务层,由程序控制调用什么实现,不管最终有多少种实现,用户都只调用业务层。

用了IOC思想之后,程序架构没有变化,只是把程序主动权移交了,之前的主动权在业务层,现在移交到用户手中,由用户选择调用什么实现。

这就是最大的区别,主动权的移交

3、改写案例

3.1 导入Jar包

<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.10.RELEASE</version>
</dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>

3.2. 编写代码

编写一个Hello实体类

public class Hello {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void show() {System.out.println("this is hello");}
}

编写我们的spring配置文件,官方的默认配置文件名为applicationContext.xml,这里我们暂时命名为beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean就是java对象 , 由Spring创建和管理--><bean id="hello" class="com.kuang.pojo.Hello"><property name="name" value="Spring"/></bean>
</beans>

进行测试

@Test
public void fun1(){//获取spring上下文对象,解析beans.xml文件,生成管理相应的Bean对象ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");//getBean : 参数即为spring配置文件中bean的id .Hello hello = (Hello) context.getBean("hello");hello.show();
}

这里new ClassPathXmlApplicationContext()的时候有个好记的小技巧,拼音缩写:cpx(吃螃蟹)

3.3. 思考

  • Hello 对象是谁创建的 ? 【 hello 对象是由Spring创建的 】
  • Hello 对象的属性是怎么设置的 ? 【hello 对象的属性是由Spring容器设置的 】

分析一下xml配置文件中的内容:

bean标签就是一个对象,class是对应的类型,这里就是相当于new了一个Hello

正常Java中,创建一个对象是 类型 变量名 = new 类型();

在IOC中:

  • bean标签中id就是变量名
  • class是对象的全路径
  • property相当于给对象中的相应属性设置一个值

IOC(一) - 初识相关推荐

  1. 手把手教你实现TypeScript下的IoC容器

    在此篇文章开始之前,先向大家简单介绍 IoC.什么是 IoC?以及为什么我们需要 IoC?以及本文核心,在 TypeScript 中实现一个简单的 IoC 容器? 目录 [隐藏] IoC 定义 初识 ...

  2. Day38——Spring学习笔记1

    Spring初识 文章目录 Spring初识 1 认识 2 IOC基础 初识案例: IOC本质 3 HelloSpring 4 IOC创建对象的方式 5 Spring配置 6 属性注入 7 自动装配 ...

  3. 初识 Spring(02)---(IOC)

    IOC 参照<Spring思维导图,让Spring不再难懂(IOC篇)> 写过java的都知道:所有的对象都必须创建:或者说:使用对象之前必须先创建.而使用ioc之后,你就可以不再手动创建 ...

  4. Spring学习笔记(一):初识IOC和DI

    学习资料来源:http://how2j.cn/k/spring/spring-ioc-di/87.html 首先,不必为看到两个新名词而感到头疼,理解了它们的作用就会发现其实是很简单的东西 Sprin ...

  5. Spring 实践 -IoC

    Spring 实践 标签: Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转) ...

  6. 一分钟带你玩转 Spring IoC

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:干掉 Navicat:这个 IDEA 的兄弟真香!个人原创100W+访问量博客:点击前往,查看更多 前言 我们对 ...

  7. ASP.NET Core 2.0使用Autofac实现IOC依赖注入竟然能如此的优雅简便

    初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通的.这是因为其使用了依赖注入 (DI) 的软件设计模式,代码的设计是遵循着"高内聚.低耦合 ...

  8. 控制反转_Spring:IOC 控制反转

    Spring 概述 Spring 是什么 Spring 是分层的 Java SE/EE 应用 full-stack (全栈式) 轻量级开源框架. 全栈式:对各种主流技术和框架都进行了整合,同时对三层架 ...

  9. Spring IoC?看这篇文章就够了...

    前言 刚开始听到 IoC,会觉得特别高大上,但其实明白原理了很简单. 跟着我的脚步,一文带你吃透 IoC 原理. 本文围绕 是何.为何.如何 来谈: 是何 上一篇文章有同学问我在官网该看哪些内容,怎么 ...

最新文章

  1. windows下nginx+tomcat分布式集群部署
  2. 1.2.4 在Python中使用向量化的技巧和注意事项
  3. STM32F103C8T6
  4. GraphPad Prism 9.3 更新内容,支持Monterey和Win11
  5. php防止报错,php报错:Cannot redeclare class 提示的解决方法
  6. Asp.net 2.0 动态加载其他子目录用户控件问题
  7. 【qduoj - 1121】小明的贪心题(Dijkstra最短路 + 最短路条数)
  8. Linux SSH免密码登录
  9. 调整DOSBOX窗口大小
  10. Deploy a replica set
  11. xp计算机保护系统,XP系统总是弹出“Windows文件保护”窗口提示的解决方法
  12. 论文研读 —— 4. You Only Look Once Unified, Real-Time Object Detection (3/3)
  13. 如何截取电影画面转换成gif动图做微信表情包
  14. Win10左下角搜索框无法搜索点击无反应的解决方法
  15. 经济的1000+篇文章总结
  16. 【信息系统项目管理师】2019年上半年信息系统项目管理师上午综合知识真题
  17. ngram语言模型—基于KneserNey及Modified Kneser Ney平滑
  18. 因硬盘变动导致的ubuntu启动错误: /dev/sda1 xxxx clean, xxxx/xxxx files, xxxx/xxxx blocks
  19. google 面试题
  20. 搜索引擎SEO快速排名算法大揭秘

热门文章

  1. Python实现按奇偶排序数组
  2. 一文教你看懂BP反向传播。不会你打我
  3. 汇编语言LEA和OFFSET区别
  4. 李宏毅机器学习GAN作业之动漫头像生成记录
  5. TensorFlow TFRecord数据集的生成与显示
  6. php生成国密验证,PHP+gmssl命令行实现国密加解密
  7. 学好日语两年之内到日本去挣钱
  8. python绘制繁花曲线代码_使用python和pygame绘制繁花曲线
  9. 安装wampserver2时提示丢失MSVCR100.dll
  10. os.environ的解释