1.常规方式实现实例化

1.1已有角色如下:

一个接口Interface,两个接口实现类InstatnceA、InstanceB,一个调用类User

1.2当前实例化InstanceA如下:

Interface interface = new InstanceA(); #User类中的实例化代码

1.3欲修改如下:

现在想把实例化对象改为InstatnceB而不要实例化InstanceA

1.4代码修改如下:

Interface interface = new InstanceB(); #修改后的User类中的实例化代码,由InstanceA修改为了InstanceB

1.5总结:

User控制实例化哪个类(是实例化InstanceA还是InstanceB);当我们想修改实例化的类时必须去修改User中的代码。

2,.控制反转实现实例化

2.1已有角色如下:

一个接口Interface,两个接口实现类InstatnceA、InstanceB,一个调用类User,还有一个bean.xml(其维护一个Instance的id与InstanceA和InstanceB的对应关系)

2.2当前实例化InstanceA如下:

Interface interface = new Instance(); #User类中的实例化代码
<bean id="Instance" class="com.test.core.InstanceA"></bean> #bean中的映射关系

2.3欲修改如下(和1.3一样):

现在想把实例化对象改为InstatnceB而不要实例化InstanceA

2.4代码修改如下:

Interface interface = Instance(); #User类中的实例化代码,并不需要修改
<bean id="Instance" class="com.test.core.InstanceB"></bean> #对应关系为Instance--InstanceA变更为instance--InstanceB

2.5总结

spring控制实例化哪个类(是实例化InstanceA还是InstanceB);当我们想修改实例化的类时只要去修改bean.xml中的映射关系,而不用去User修改代码

3.依赖注入

User要实例化一个对像就需要一个类(InstatnceA或InstanceB)这就是一种依赖,控制反转后真正依赖的类(即要实例化的类)由beans.xml注入到User类。

依赖注入就是控制反转的别名,依赖注入侧重描述目地控制反转侧重描述现像(所以有时会见到依赖注入比控制反转给为准确的说法)。

4. MVC、IOC和ORM

SSH框架是Java Web的基石,而其中Struts核心概念是MVC、Spring的核心概念是IOC和Hibernate的核心概念是ORM,围绕这六个(或者叫三个)名词诞生了一本又一本让人看到想放弃的Java Web书藉。

其实抛开配置等细节问题仅从思想角度来看,MVC、IOC和ORM就是一回事,其本质都是将原本的“A调用B”模式解耦为“A通过xml调用B”的模式,以降低A和B强耦合导致的牵一发而动全身的问题(就是A或B修改后,工程中所有B或A的代码都要修改)。

另外,SSH可能会死(被别的框架取代),但是MVC、IOC和ORM永远不会死;但又反过来说到别的框架上MVC、IOC和ORM道理还是一样的不过换个xml文件罢了。

框架 核心概念 A xml B xml作用
Struts MVC 前端web页面 struts.xml 后端表单处理类 struts.xml控制了前端页面实际会被推送到的类,当A/B有修改一般对此xml稍作调整即可
Spring IOC new class的代码 beam.xml class本身 beam.xml控制了new class会真正被实例化的类,当A/B有修改一般对此xml稍作调整即可
Hibernate ORM table.hbm.xml 数据库表 table.hbm.xml控制了类属性与数据表的列的对应关系,当A/B有修改一般对此xml稍作调整即可

参考:

https://www.cnblogs.com/whgk/p/6074930.html

Spring控制反转(依赖注入)的最简单说明的更多相关文章

  1. Spring IOC - 控制反转(依赖注入) - 入门案例 - 获取对象的方式 - 别名标签

    1. IOC - 控制反转(依赖注入) 所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交 由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和生命周 ...

  2. 玩转Spring MVC (一)---控制反转(依赖注入)

    Spring的核心是控制反转,什么是控制反转呢?小编浅述一下自己的拙见,有不当之处还希望大家指出. 控制反转(IOC),也可以叫做依赖注入(DI),这两个词其实是一个概念. 控制反转,那是什么控制被反 ...

  3. Spring框架使用(控制反转,依赖注入,面向切面AOP)

    参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion ...

  4. 码农小汪-spring框架学习之2-spring IoC and Beans 控制反转 依赖注入 ApplicationContext BeanFactory

    spring Ioc依赖注入控制反转 事实上这个东西很好理解的,并非那么的复杂. 当某个Java对象,须要调用还有一个Java对象的时候(被依赖的对象)的方法时.曾经我们的做法是怎么做呢?主动的去创建 ...

  5. 控制反转&依赖注入

    IoC(Inversion of Control,控制反转).这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.这是什么 ...

  6. [PHP] 控制反转依赖注入的日常使用

    控制反转:控制权交给了自己的类 依赖注入:依赖另一个类,我没有手动去new它 <?php /*我自己要用的类*/ class User { private $name; private $age ...

  7. C#扫盲篇(二)依赖倒置•控制反转•依赖注入•面向接口编程--满腹经纶的说

    扫盲系列的文章收到了广大粉丝朋友的支持,十分感谢,你们的支持就是我最大动力. 我的扫盲系列还会继续输出,本人也是一线码农,有什么问题大家可以一起讨论.也可以私信或者留言您想要了解的知识点,我们一起进步 ...

  8. 控制反转 依赖注入 main函数

    通过依赖注入.服务定位实现控制反转 Go kit - Frequently asked questions https://gokit.io/faq/ Dependency Injection - W ...

  9. Spring IOC - 控制反转(依赖注入) - 单例和多例

    Spring容器管理的bean在默认情况下是单例的,即一个bean只会创建一个对象,存在map中,之后无论获取多少次该bean,都返回同一个对象. Spring默认采用单例方式,减少了对象的创建,从而 ...

  10. Spring IOC - 控制反转(依赖注入) - 配置初始化和销毁的方法

    在Spring中如果某个bean在初始化之后,或销毁之前要做一些额外操作可以为该bean配置初始化和销毁的我方法,在这些方法中完成需要的功能. 实验: 通过断点调试模式,测试初始化方法和销毁方法的执行 ...

随机推荐

  1. Educational Codeforces Round 25 E. Minimal Labels 拓扑排序+逆向建图

    E. Minimal Labels time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  2. P1622 释放囚犯

    传送门 区间DP简介: 在写这题前,需要先弄清楚区间DP是如何操作的: 区间DP的做法还是相对固定的,没有其他类型DP的复杂多变.主要思想就是先在小区间进行DP得到最优解,然后再利用小区间的最优解合并 ...

  3. go helloworld

    // Sample program to show how a bytes.Buffer can also be used // with the io.Copy function. package ...

  4. JDK10 新特性

    关于至此,我从大一下学习,以及大二上的巩固,这应该是SE部分的最后一章节内容,介绍一下jdk10的新特性 jdk在更新10之后,出现很多新特性,根据我所观看的视频,主要提及以下几点新特性 1.新增va ...

  5. Oracle其他简单查询

    范例:查询公司中所有雇员的职位信息 SELECT job FROM emp; 实际在公司里面,一个职位会有多个人员.如果查询全部职位,肯定会存在重复.要消除掉重复,利用DISTINCT完成.(dist ...

  6. Qt532.QString::split()

    1.效果 和 JS里面 貌似是一样的 1.1.QString 编码转换(https://www.cnblogs.com/CodeSkill/p/5082447.html) 2.代码: void Mai ...

  7. Qt5.WebView.添加节点的测试代码

    1.代码: #include "mainwindow.h" #include "ui_mainwindow.h" #include <QWebFrame& ...

  8. scala函数式编程(一)

    scala函数编程特点: 1.Scala函数使用命名参数: 即函数参数传递的实参与函数名相对应,与函数位置不对应. object Test { def main(args: Array[String] ...

  9. 力扣(LeetCode)500. 键盘行

    给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词.键盘如下图所示. 示例: 输入: ["Hello", "Alaska", "Dad& ...

  10. strip函数

    f=open('a.txt',)for l in f.readlines(): print(l.strip())  # 默认清除字符串l的首尾位的\n或空格,如果是l.strip("a&qu ...