首页 > Spring学习-理解IOC和依赖注入

Spring学习-理解IOC和依赖注入

最近刚买了一本介绍ssm框架的书,里面主要对Mybatis、spring、springmvc和redis做了很多的讲解,个人觉得虽然有的内容我看不懂,但是整体上还是不错的。最近正在学习中,一边学习一边做一些总结,现在我对这些思想技术还没有达到很深入的理解,所以总结的比较浅显。现在就把有关spring IOC的知识总结一下:

1.理解IOC和依赖注入

IOC,就是控制反转:是一种通过描述并通过第三方去产生或获取特定对象的方式。刚开始听到这个名词的时候,感觉很难理解,随着逐渐熟悉,可以简单的理解为,创建对象不需要通过new,而是交给spring容器,那spring容器创建对象并交给你使用的过程叫依赖注入。也就是说spring容器创建对象是通过依赖注入来完成的。

2.依赖注入的三种方式

既然spring创建对象是通过依赖注入来完成的,那就要讲到依赖注入的三种方式了。一般来说,依赖注入可以分为三种方式。

  • 构造器注入。
  • setter注入。
  • 接口注入。

构造器和setter注入是主要的方式,接口注入是从别的地方注入的方式。

2.1 构造器注入

原理:构造器注入是依赖于构造方法来实现的,大多数的情况下,我们是通过类的构造器来创建对象的,spring是通过反射的方式,通过构造器来完成注入。在配置文件中添加以下配置信息。

代码如下:


constructor-arg元素是用于定义类构造方法的参数,index是定义参数的位置,value则是设置参数的值,通过这样的定义spring便知道使用什么样的构造方法去创建对象了。

这样的注入方式比较简单,但是缺点就是如果构造方法的参数非常多,那么这样的构造方法就会变得复杂,可读性也会得差,所以要考虑其它的方式。

2.2 setter注入

setter注入是spring中最主流的注入方式,它利用java bean规范所定义的setter方法来完成注入,灵活且可读性也高。就是消除了构造器注入时出现过多参数的问题,首先把构造器声明为无参的,然后通过setter注入为其设置对应的值,其实也是通过反射技术实现的,

配置信息如下:


通过这样的配置spring就会通过反射调用无参构造器生成对象,同时通过反射对应的setter注入配置值了。这种方式是spring最为主要的方式。

2.3 接口注入

这个方式好像不是很常用,所以这里就不做总结了,只是简单的了解一下。

小结

以上是对我学习的一些总结,内容不是很专业,所以下面引用其他大神们的讲解

看大神的讲解

下面内容来自:http://jinnianshilongnian.iteye.com/blog/1413846

3.1.1 IoC是什么

Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

  • 谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

  • 为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

用图例说明一下,传统程序设计如图3-1,都是主动去创建相关对象然后再组合起来:

1240732-20171011112029730-800630219.png

图3-1 传统应用程序示意图

当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图3-2所示:

1240732-20171011112048480-652717144.png

图3-2有IoC/DI容器后程序结构示意图

3.1.2 IoC能做什么

IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。

IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

3.1.3 IoC和DI

DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

  • 谁依赖于谁:当然是应用程序依赖于IoC容器;

  • 为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

  • 谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

  • 注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”

转载于:https://www.cnblogs.com/black-spike/p/7648164.html

更多相关:

  • 点云PCL免费知识星球,点云论文速读。文章:DSP-SLAM: Object Oriented SLAM with Deep Shape Priors作者:Jingwen Wang Martin Runz Lourdes Agapito编译:点云PCL代码:https://github.com/JingwenWang95/DSP-S...

  • RAM缓存 新RAM缓存算法(CLFUS) 新的RAM缓存使用的创意来自许多缓存替换策略和算法,包括LRU,LFU,CLOCK,GDFS及2Q,它被命名为时钟周期内最小频繁使用大小算法CLFUS(Clocked Least Frequently Used by Size)。它避开了任何专利算法,具有如下特性: 均衡最近性(Rec...

  • MP4 |视频:AVC,1280×720 30 fps |音频:AAC,48 KHz,2 Ch |时长:2h 12m 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:560M C4D是一个有抱负的运动图形艺术家和设计师的重要工具。借助C4D,您可以使用3D对象、动态效果和动画来增强运动图形、模型和可视化效果。本课...

  • 文章目录先说问题:再说解决尝试1:尝试2(该尝试建议先在自己环境搭配对应业务测试通过后再现场尝试): 感谢 学无止境996同学的陪伴和vigourtyy美丽女友的支持,直到这个解决问题的深夜 先说问题: ceph 12.2.1生产环境:3副本 tier + 3副本data 机房在拥有业务的情况下重启集群交换机,产生如下场景...

  • 这周主要学习了java中的类和对象的知识点,发现和C++中的类和对象极为相似,对于类和对象的概念理解起来也简单。同时在自学的过程中也把类的知识重新复习巩固了一下(如类的三大特征:继承,封装和多态,构造,成员对象的访问权限,构造,无参有参函数的调用等),同时也了解到一些新的概念,比如类对象创建和引用占据堆内存和栈内存,输出对象时默认调...

  •    随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL...

  • 天地会珠海分舵注:随着微信应用号的呼之欲出,相信新一轮的APP变革即将发生。从获得微信应用号邀请的业内人士发出来的一张开发工具源码截图可以看到,reacjs及其相应的FLUX框架altjs很有可能会成为前端开发主流。作为行业内人士,自己之前从来没有做过web及webapp开发,所以这方面算是一名小白。这段时间在忙完工作之余准备储备...

  • 习题5 2. (1)写出关系模式: 学生:R1= U1={学号,姓名,出生日期,系名,班号,宿舍区}; F1={学号->(姓名,出生日期,系名,班号,宿舍区),班号->系名,系名->宿舍区}; 班级:R2= U2={班号,专业名,系名,人数,入校年份}; F2={班号->(专业名,人数,入校年份),专业名->系名,(专业名,入校年份)...