文章目录
- 前言
- 容器
- 总结
前言
前面我们完成
bean
以及依赖注入
的相关学习,现在我们进入到核心容器
的最后一块内容了,也就是与容器相关操作的学习🎈🎈。
容器
前边我们获取容器是这样获取的👇👇。
这只是获取容器的其中一种方式,我们管它叫:
加载类路径下的配置文件
,其实Spring还提供有另外一种加载配置文件的方式,也就是使用文件的绝对位置
,也就是它在哪个盘符下的这种形式来进行加载,那怎么写呢,我们接下来来看看👇👇。
注意:
里边传递的参数是文件的绝对路径
,这种方式叫:从文件系统下加载配置文件
,我们以后肯定用的是第一种,这种方式我们了解一下就好了。
容器得到了,下面我们就要说获取bean的操作了,我们先来看看
常用
的获取bean的操作👇👇。
我们会发现,这种方式获取bean,每次前边都要做
强制类型转换
,这写出来就有点太难受了,这里有一种更好的形式,但是这种形式写出来的代价也有👇👇。
这种方式的第二个参数的意思是:
告诉我们获取的bean是什么类型的
,好像这种形式也没什么不一样,只不过放在后边了而已,但是按照这种形式来看,我们似乎可以想象到另外一件事,我们前边是不是学过自动装配
,里边有一个按类型装配
,在Spring容器中它是可以按照类型来找一个bean的,那我们能不能按照类型来获取bean呢❓❓,也是可以的,所以有第三种格式👇👇
这种形式是不是直接就ok了,但是有一个问题,我们容器中对应的bean只能有
一个
,如果我们有多个的话,肯定是会报错的,因为不唯一,到这里我们就学习了容器初始化
的两种方式以及bean加载
的两种方式,在这里我们再来补充一下,在容器初始化中不管用哪种方式,都可以加载多个配置文件
👇👇。
这就是我们与容器相关的两个核心操作❗❗。
接下来我们要来分析
ApplicationContext接口
,先打开它的类继承层次图(ctrl+H)
👇👇。
我们会看到在它的下边又有一个接口,这个接口里边有一个
close()
方法,也就是说ApplicationContext
这个接口提供的是基础功能
,在它的基础之上,它的一个子接口对它进行了功能的追加,而再下边的这些是对上边的实现,一级一级往下走,我们用的是它的两个实现类,这里边就要提出一个问题了,我们ApplicationContext接口,它还有没有上层的接口了,我们来查看一下它的源码👇👇。
我们会发现它继承了很多,我们要翻一下它的最顶层的接口是谁,怎么翻呢,我们可以从每一个接口进去看,在这里
ListableBeanFactory接口
往上追就能追到最顶层
接口👇👇。
这个接口有什么用呢,注意:
Spring1.0
的时候最先出来的不是ApplicationContext接口,而是现在这个BeanFactory接口
,也就是说使用它也能够做我们的这种IOC容器,但是它有它的一些局限性
,所以后期在它的基础之上发展得到了ApplicationContext接口,并且通过若干子接口的功能的扩张,达到了一个最佳的状态,也就是说现在ApplicationContext接口提供的功能要比BeanFactory接口提供的功能多的多,打开BeanFactory类的继承图我们来看一下👇👇。
我们的ApplicationContext在哪呢,在第二个的下边👇👇,再往下,我们就可以找到对应的实现类❗❗
这是它们之间的层次关系,那我们的
BeanFactory
接口能不能创建容器呢,当然可以,接下来我们来看一下,了解即可🎈🎈
注意:它在造的时候里边要的
参数
是什么呢,是我们的配置文件吗,当然不是,它是要一个resource的对象
,那我们就给它一个resource对象,我们在这里用的是它的实现类来造的,里边传递的应该是配置文件
,这个时候我们就能获取到我们的配置文件,然后初始化出来BeanFactory
对象了,剩下的就跟前边一样了🎉🎉。
那对于ApplicationContext和BeanFactory有哪些
核心区别
呢❓❓,有一个区别,就是BeanFactory加载的bean和我们的ApplicationContext加载的bean加载的时机不一样
❗❗注意看一个东西:我现在把以下两行注掉👇👇
现在我们仅仅是造出BeanFactory对象,然后我在BookDaoImpl这边加一个小东西👇👇,我把它的
构造方法
加上,里边就只干一件事,打印一句话,我们再来运行一下程序看看效果。
运行完了,已经执行结束了,这个bean的构造方法都没有被运行,接着回到我们App里边👇👇。
我们把这两行也注掉,也是只加载了ApplicationContext,再来运行一下👇👇
什么样的差别呢❓❓,叫做BeanFactory它是
延迟加载bean
,ApplicationContext它是立即加载bean
,也就是启动容器bean直接就初始化好了,而BeanFactory不是,那有人说那我用ApplicationContext能不能做这个效果呢❓❓,当然是可以的,我们只需要在配bean的时候加一个参数:lazy-init
,给它个true就行了👇👇。
总结
以上就是我们核心容器的全部内容,我们先讲了
创建容器的两种方式
,接下来讲了初始化bean的三种方式
,也看了关于容器类层次结构
,最后学习了ApplicationContext接口的顶层接口beanFactory
,最后,如果有什么错误的话,大家可以私信我📬📬,希望大家多多关注+点赞+收藏 _🙏🙏,你们的鼓励是我不断前进的动力💪💪!!!