这里是修真院后端小课堂,每篇分享文从
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析后端知识/技能,本篇分享的是:
【Spring中的IOC是什么意思 】
【修真院java小课堂】Spring中的IOC是什么意思
大家好,我是IT修真院武汉分院第17期的学员汪天驰,一枚正直纯洁善良的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一个返回。
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
更多内容,可以加入IT交流群565734203与大家一起讨论交流
这里是技能树·IT修真院:nofollow">https://www.jnshu.com,初学者转行到互联网的聚集地
原文链接:https://www.f2er.com/spring/67465.html