前言学习过Spring框架的人一定都会听过Spring的IOC(控制反转) 这个概念,对于初学Spring的人来说,总觉得IOC是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring IOC的理解 。
读者福利:私信回复【111】获取整理好的spring全家桶学习笔记和面试题资料(1184页PDF文档)
文章插图
IOC是什么IOC——Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想 。在JAVA开发中,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制 。如何理解好IOC呢?理解好IOC的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:
(1)谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等) 。
(2)为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了 。
用图例说明一下,传统程序设计如图,都是主动去创建相关对象然后再组合起来:
文章插图
【很多人学Spring框架,总觉得IOC模糊不清?】
当有了IOC的容器后,在客户端类中不再主动去创建这些对象了,如图所示:
文章插图
接下来我们说一下IOC的4个特性
文章插图
1. lazy-Init延迟加载Bean对象的延迟加载(延迟创建)
ApplicationContext 容器的默认?为是在启动服务器时将所有 singleton bean 提前进?实例化 。提前实例化意味着作为初始化过程的?部分,ApplicationContext实例会创建并配置所有的singleton bean 。
1.1 XML方式开启延迟加载:
lazy-init="" 配置bean对象的延迟加载 ,true或者false false就是立即加载
<bean id="lazyResult" class="com.lagou.edu.pojo.Result" lazy-init="false"></bean>
我们先来看一下当lazy-init="false" 也就是立即加载的时候:文章插图
可以看到,在容器启动后,getBean之前,lazyResult这个bean已经存在了 。
然后我们把lazy-init="true",设置为true
文章插图
然后我们F8往下走一步:
文章插图
发现出现了lazyResult
1.2 注解开启延迟加载:
@Lazy:
文章插图
1.3全局配置——default-lazy-init="":
在bean的根标签中:
文章插图
应用场景:
(1)开启延迟加载?定程度提?容器启动和运转性能
(2)对于不常使?的 Bean 设置延迟加载,这样偶尔使?的时候再加载,不必要从?开始该 Bean 就占?资源
2. FactoryBean和BeanFactory2.1 BeanFactory
容器的顶级接口,定义了容器的一些基础行为,负责生产和管理Bean的一个工厂,具体使用它下面的子接口类型,比如ApplicationContext
2.2 FactoryBean
spring中的bean有两种
- 普通bean
- 工厂bean(FactoryBean)
可以生产某一个类型的bean实例(返回给我们),也就是说我们可以借助于它自定义bean的创建过程 。
推荐阅读
- 鱿鱼和八爪鱼的区别
- 尖椒酱的做法大全
- 翡翠|翡翠很善变你知道吗
- 苕粉和宽粉一样吗 宽粉苕粉区别
- 宽粉煮多久几分钟能熟 宽粉多久可以煮熟
- 狗狗不喜欢剪指甲 狗狗剪指甲不配合怎么办
- 从零开始入门K8S| 从Spring Cloud到Kubernetes的微服务迁移实践
- 非人学园即将到来的联动 非人学园联动美好世界什么时候出
- 怎样养胃 几款食疗秘方帮你养胃
- 消炎药应该饭前还是饭后吃