Spring中的IOC是什么意思

大憨熊 提交于 2020-03-11 02:22:34

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能。

大家好,我是IT修真院武汉分院的汪天驰,一枚正直纯洁善良的java程序员。

今天给大家分享一下,修真院官网java任务1,深度思考中的知识点——Spring中的IOC是什么意思

(1)背景介绍:

Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。

应用程序是由一组相互协作的对象组成。

Spring框架除了帮我们管理对象及其依赖关系,还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,

还能帮我管理最头疼的数据库事务,本身提供了一套简单的JDBC访问实现,提供与第三方数据访问框架集成(如Hibernate、JPA),与各种Java EE技术整合(如Java Mail、任务调度等等),提供一套自己的web层框架Spring MVC、而且还能非常简单的与第三方web框架集成。

从这里我们可以认为Spring是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力,从而使我们可以更自由的选择到底使用什么技术进行开发。

Spring IOC

SpringIOC-Iversion of Control

即“控制反转”,不是什么技术,而是一种设计思想。

在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

谁控制谁,控制什么:

传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;

而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;

谁控制谁?

当然是IoC 容器控制了对象;

控制什么?

那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

为何是反转,哪些方面反转了:

有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;

而反转则是由容器来帮忙创建及注入依赖对象;

为何是反转?

因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;

哪些方面反转了?

依赖对象的获取被反转了。

(2)知识剖析:

 

IOC的作用:

 1 IoC 是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。

传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;

有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,

所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

 

IOC容器也是具有依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

 应用程序无需直接在代码中new相关的对象,应用程序由IOC容器进行组装。在Spring中BeanFactory是IOC容器的实际代表者。

Spring IOC容器如何知道哪些是它管理的对象呢?

这就需要配置文件,Spring IOC容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配。

一般使用基于xml配置文件进行配置元数据,而且Spring与配置文件完全解耦的,可以使用其他任何可能的方式进行配置元数据,比如注解、基于java文件的、基于属性文件的配置都可以。

DI:依赖注入  

依赖注入(DI)是一种实现IOC的技术手段。

理解DI的关键:谁依赖谁,为什么需要依赖,谁注入谁,注入了什么?

①.谁依赖谁?应用程序依赖于IoC容器。

让spring创建sqlsession bean。也就是通过SqlSessionFactory创建SqlSession

②.为什么需要依赖?应用程序需要IoC容器来提供对象需要的外部资源(包括对象,文件等)。

③.谁注入谁?IoC容器注入应用程序某个对象,应用程序依赖的对象。

④.注入了什么?注入某个对象所需要的外部资源(包括对象、资源、变量数据)

 

(3)常见问题:

1 spring中的BeanFactory与ApplicationContext的作用和区别? 

BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。

2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:

比如资源访问,事件传递,通过ApplicationContext扩展了ResourceLoader(资源加载器)接口。 

 3. ApplicationContext的初始化和BeanFactory有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标Bean;

而ApplicationContext则在初始化应用上下文时就实例化所有的单实例的Bean。

 因此ApplicationContext的初始化时间会比BeanFactory稍长一些. .Spring容器能够自动装配相互合作的bean,

 这意味着容器不需要construor-arg和property配置,能通过Bean工厂自动处理bean之间的协作 

2 什么是自动装配 .

Spring容器能够自动装配相互合作的bean,这意味着容器不需要construor-arg和property配置,能通过Bean工厂自动处理bean之间的协作

(4)编码实战:

(5)拓展思考:

IOC的优点

 

IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。

最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。 

(6)参考文献:

 http://www.cnblogs.com/chenssy/p/9576769.html

(7)更多讨论:

Q1:IOC有哪些缺点?

A1:

1,创建对象的步骤变复杂了

2,通过反射来创建对象会造成效率上的损耗

3,缺少IDE重构支持,如果修改了类名还需要到XML文件中手动修改

Q2:By Type和 By Name的区别?

A2:byName 通过参数名 自动装配,如果一个bean的name 和另外一个bean的 property 相同,就自动装配。
     byType 通过参数的数据类型自动自动装配,如果一个bean的数据类型和另外一个bean的property属性的数据类型兼容,  就自动装配。

Q3:getBean(“someBean”)时做了什么? 

A3:如果bean是单例,而且对象没有实例化,则按照上面写的流程利用反射new一个出来,然后放到Map里面。如果已经实例化,则直接从Map里面取出来直接返回。 如果是多例,每次都new一个返回。

PPT链接 视频链接

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

------------------------------------------------------------------------------------------------------------

“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,学习的路上不再迷茫。”

技能树.IT修真院

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!