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

news2024/11/14 2:10:16

文章目录

  • 前言
    • 容器
  • 总结

前言

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue CLI脚手架

1、Vue的开发模式 目前我们使用vue的过程都是在html文件中,通过template编写自己的模板、脚本逻辑、样式等。 但是随着项目越来越复杂,我们会采用组件化的方式来进行开发: 这就意味着每个组件都会有自己的模板、脚本逻辑、样式等&#xff…

凌恩生物报告升级,科研美图助力群落互作机制研究

2022年,在多位技术支持与生信工程师的通力合作下凌恩生物报告升级重磅升级!扩增子分析流程项目从60到120,可谓是加量不加价的超值更新了!结题报告的结果图片可直接用于文章发表,快一起来看看!小小的举个例子…

pytorch【Conv2d参数介绍】

def __init__(self,in_channels: int,out_channels: int,kernel_size: _size_2_t,stride: _size_2_t 1,padding: _size_2_t 0,dilation: _size_2_t 1,groups: int 1,bias: bool True,padding_mode: str zeros # TODO: refine this type):in_channels:网络输入…

《Linux性能优化实战》学习笔记 Day03

04 | 零拷贝:如何高效地传输文件? 原文摘抄 文件拷贝 上下文切换的成本并不小,虽然一次切换仅消耗几十纳秒到几微秒,但高并发服务会放大这类时间的消耗。 每周期中的 4 次内存拷贝,其中与物理设备相关的 2 次拷贝是…

再学C语言37:函数、数组和指针

编写一个对数组进行操作的函数,并进行调用 一般形式举例: int sum(int * arr, int n); // 函数原型// 第一个参数把数组地址和类型信息传递给函数// 第二个参数把数组中元素的个数传递给函数int main(void) {...int total;total sum(array_t, 10);...…

分分钟你也能写一个自己需要的 Chrome 扩展程序

废话 对于chrome浏览器想必大家大不陌生了,里面的扩展程序(本文后面称插件),多多少少也都用过吧,毕竟可以辅助自己的日常工作,娱乐等等,添加完之后呢,就会多出一些操作按钮&#xf…

年度总结-你觉得什么叫生活?

陈老老老板🦸👨‍💻本文专栏:生活(主要讲一下自己生活相关的内容)👨‍💻本文简述:生活就像海洋,只有意志坚强的人,才能到达彼岸。👨‍💻上一篇文章…

Linux常用命令——tr命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tr 将字符进行替换压缩和删除 补充说明 tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。 语法 tr(选…

云逗猫——直播弹幕控制机械臂逗猫棒

这个东西思路是很简单的。简单来说在直播画面用文字跟观看者约定一些弹幕指令,然后用爬虫爬取直播弹幕,当爬到弹幕是约定的指令时,通过串口给舵机控制板发送信号,控制板控制舵机转动,机械臂就会做相应的动作。 猫 两…

Lesson2无头单向非循环链表(中)

1.链表 1.1链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 1.2链表的分类 实际中链表的结构非常多样,以下情况组合起来就有8种链表结构: 1.…

【SAP Hana】X档案:SAP HANA 数据库基础知识

SAP HANA 数据库基础知识1、基本规则(1)注释(2)标识符(3)引号(4)保留字2、数据类型(1)日期时间类型(2)数字类型(3&#xf…

SNMP简单网络管理协议

随着网络的规模越来越庞大,网络中的设备种类繁多,如何对越来越复杂的网络进行有效的管理,从而提供高质量的网络服务,已成为网络管理所面临的巨大挑战。网络的管理和运维手段多样,下面将对几种常见的网管与运维手段展开…

[leetcode.29]两数相除,位运算虽好,不要满眼是她

题目如下 不允许用乘除法,但是我们可以用加减法和位运算。。。不过这里不要用位运算,比如说你要是想用补码交替除法,你根本无法获得移动几位(移动31位?太鬼畜了吧) 所以说单纯的除法部分,我们可…

测试开发 | 实战演练基于加密接口测试测试用例设计

image1080594 76.4 KB 如果接口测试仅仅只是掌握一些requests或者其他一些功能强大的库的用法,是远远不够的,还需要具有根据公司的业务以及需求去定制化一个接口自动化测试框架能力。所以在这个部分,会主要介绍接口测试用例分析以及通用的流程…

从零开始 verilog 以太网交换机(二)MAC接收控制器的设计与实现

从零开始 verilog 以太网交换机(二)MAC接收控制器的设计与实现 🔈声明: 😃博主主页:王_嘻嘻的CSDN主页 🧨 从零开始 verilog 以太网交换机系列专栏:点击这里 🔑未经作者允…

plt绘制点线图 点(marker)过密的解决办法

设置 markevery10 plt.plot(x, y, markero, markevery10) import matplotlib.pyplot as plt import numpy as npxnp.arange(0,2*np.pi,0.01) ynp.sin(x)fig, ax plt.subplots(constrained_layoutTrue)plt.title(markevery10)ax.plot(x, y, markero, markevery50, mfcr,mecr)…

(小甲鱼python)函数笔记合集四 函数(IV)总结 函数中参数的作用域 局部作用域 全局作用域 global语句 嵌套函数 nonlocal语句等详解

一、基础复习 函数的基本用法 创建和调用函数 函数的形参与实参等等函数的几种参数 位置参数、关键字参数、默认参数等函数的收集参数*args **args 解包参数详解 二、函数中参数的作用域 作用域:一个变量可以被访问的范围,一个变量的作用域总是由它在代…

jQuery学习-01jQuery下载安装

1 jQuery的介绍 jQuery就是js函数库,里面有大量的js函数库,使用这些函数操作dom对象,做事件,动画,ajax处理; 地址:https://jquery.com/ 2下载 地址:https://jquery.com/download/…

Apache Solr 9.1-(一)初体验单机模式运行

Apache Solr 9.1-(一)初体验单机模式运行 Solr是一个基于Apache Lucene的搜索服务器,Apache Lucene是开源的、基于Java的信息检索库,Solr能为用户提供无论在任何时候都可以根据用户的查询请求返回结果,它被设计为一个强…

day12-继承

1. 继承 1.1 继承的实现(掌握) 继承的概念 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法 实现继承的格式 继承通过extends实现格式:class 子…