【Spring(七)】详细了解Spring的核心容器

2年前未命名189
【Spring(七)】详细了解Spring的核心容器 续写青春. 于2023-01-18 19:52:57发布 136 收藏 12 分类专栏: Spring 文章标签: spring java Spring 专栏收录该内容 7 篇文章 0 订阅 订阅专栏

文章目录 前言容器 总结

前言

  前面我们完成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,最后,如果有什么错误的话,大家可以私信我📬📬,希望大家多多关注+点赞+收藏 _🙏🙏,你们的鼓励是我不断前进的动力💪💪!!!

标签: [db:标签TAG]

相关文章

ChatGPT 为我制作了一张地图

ChatGPT 为我制作了一张地图...

码农饭碗不保——ChatGPT正在取代Coder

码农饭碗不保——ChatGPT正在取代Coder...

2023年度数学建模竞赛汇总

2023年度数学建模竞赛汇总...

「ChatGPT」一夜之间“火爆出圈“【杞人忧天 or 未雨绸缪】

「ChatGPT」一夜之间“火爆出圈“【杞人忧天 or 未雨绸缪】...

MongoDB 4.0支持事务了,还有多少人想用MySQL呢?

MongoDB 4.0支持事务了,还有多少人想用MySQL呢?...

网络工程师必备知识点

网络工程师必备知识点...