【修真院java小课堂】SPRING中的IOC是什么意思,为什么要用IOC而不是NEW来创建实例?

大家好,我是IT修真院深圳分院第13期学员王东东,一枚正直纯洁善良的JAVA程序员。
今天给大家分享一下,修真院官网JAVA任务一,扩展思考中的知识点——SPRING中的IOC是什么意思,为什么要用IOC而不是NEW来创建实例?
一、背景介绍
spring是一种多层的J2EE应用程序框架,是以Rod Johson编写的《Expert one to one J2EE design and development》一书的代码为基础发展而来的。它是为了解决企业应用开发的复杂性而创建的。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。spring的两个核心思想就是IOC和AOP。

二、知识剖析

1)Spring容器
spring容器是 Spring 框架的核心。容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。 Spring 提供了以下两种不同类型的容器;

①.Spring BeanFactory 容器:它是最简单的容器,给 DI 提供了基本的支持。在 Spring 中,有大量对 BeanFactory 接口的实现

②.Spring ApplicationContext 容器:该容器包括 BeanFactory 容器的所有功能,并且该添加了更多的企业特定的功能,例如从一个属性文件中解析文本信息的能力,发布应用程序事件给事件监听器的能力。
所以通常建议使用ApplicationContext。

2)IOC:控制反转
IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。传统JavaSE程序设计,我们在对象内部直接通过new进行创建对象,是程序主动去创建依赖对象,而IoC有一个专门的容器来创建这些对象,即由IoC容器来创建这些对象的创建。
理解好IoC的关键是:谁控制谁,控制了什么,为何是反转,在哪些方面反转了。
①、谁控制谁?由IoC容器控制了对象;控制了什么?控制了外部资源获取(包括对象、文件等)

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

3)DI:依赖注入

依赖注入(DI)是一种实现IOC的技术手段。
理解DI的关键:谁依赖谁,为什么需要依赖,谁注入谁,注入了什么?
①.谁依赖谁?应用程序依赖于IoC容器。
让spring创建sqlsession bean。也就是通过SqlSessionFactory创建SqlSession
②.为什么需要依赖?应用程序需要IoC容器来提供对象需要的外部资源(包括对象,文件等)。
③.谁注入谁?IoC容器注入应用程序某个对象,应用程序依赖的对象。
④.注入了什么?注入某个对象所需要的外部资源(包括对象、资源、变量数据)

三、常见问题
ApplicationContext 接口实现
四、解决方案
三种方法:
①FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径。

②ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。

③WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。
五、编码实战

六、扩展思考

IOC的优缺点

IOC的优点:
实现组件之间的解耦,提高程序的灵活性和可维护性。
IOC缺点:
①、创建对象的步骤变复杂了,不直观.
②、因为使用反射来创建对象,所以在效率上会有些损耗。但相对于程序的灵活性和可维护性来说,这点损耗是微不足道的。
③、缺少IDE重构的支持,如果修改了类名,还需到XML文件中手动修改,这似乎是所有XML方式的缺憾所在。
注:本人初学java者,如有不对敬请指出,谢谢!
七、参考文献
http://jacobcookie.iteye.com/blog/1892553

https://www.w3cschool.cn/wkspring/

https://www.cnblogs.com/Wolfmanlq/p/5728668.html

https://www.cnblogs.com/NancyStartOnce/p/6813162.html

by:深圳分院 -王东东-

八.更多讨论

1.依赖注入的方式:
setter方法
构造器方法
自动装配
注解注入

2.@Autowired和@Resource有什么区别?
@Autowired注解是属于Spring的注解,按照类型(byType)装配依赖对象,依赖对象必须存在,如果要允许null值,可以设置它的required属性为false
@Resource不属于Spring的注解,默认按名称进行装配,通过name属性进行指定

举个栗子,一个类,俩个实现类,Autowired就不知道注入哪一个实现类,而Resource有name属性,可以区分。

3.By Type和 By Name的区别?

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

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。
快来与我一起学习吧。我的学习邀请码:28547998。或者直接点击链接http://www.jnshu.com/login/1/28547998


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值