Spring Boot原理分析(三):IoC容器的继承层次

news2024/9/20 6:13:01

文章目录

  • 一、Spring Ioc容器的继承层次
    • 1.BeanFactory
    • 2.ListableBeanFactory
    • 3.HierarchicalBeanFactory
    • 4.ApplicationContext
  • 二、常用的ApplicationContext的实现类
    • 1.ClassPathXmlApplicationContext(基于XML配置)
    • 2.AnnotationConfigApplicationContext(基于注解)
  • 三、Spring Boot执行IoC的工作流程

一、Spring Ioc容器的继承层次

Spring Ioc容器的继承层次如下:

在这里插入图片描述

1.BeanFactory

BeanFactory是Spring Framework提供的一个接口,它是Spring容器的基础接口。BeanFactory接口定义了Spring容器中Bean对象的基本操作,例如获取Bean对象、销毁Bean对象等。BeanFactory接口的实现类包括:DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。

BeanFactory接口定义了以下方法:

  1. getBean(String name):根据Bean的名称获取Bean对象。
  2. getBean(String name, Class<T> requiredType):根据Bean的名称和类型获取Bean对象。
  3. getBean(Class<T> requiredType):根据类型获取Bean对象。
  4. containsBean(String name):判断容器中是否包含指定名称的Bean对象。
  5. isSingleton(String name):判断指定名称的Bean对象是否为单例。
  6. isPrototype(String name):判断指定名称的Bean对象是否为原型。
  7. destroyBean(Object bean):销毁指定的Bean对象。
  8. destroy():销毁容器中的所有Bean对象。

BeanFactory接口的实现类可以通过ApplicationContext接口来获取,例如:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
BeanFactory beanFactory = context.getBeanFactory();

在这个例子中,通过ClassPathXmlApplicationContext类创建了一个Spring容器,并通过getBeanFactory()方法获取了该容器的BeanFactory实现类。

BeanFactory接口是Spring Framework中最基本的容器接口,它提供了获取Bean对象、销毁Bean对象等最基本的操作。开发人员可以使用BeanFactory接口来手动创建和管理Bean对象。但是,BeanFactory接口相对较为底层,使用起来比较繁琐,需要手动进行Bean对象的管理和依赖注入等操作。

通常情况下,开发人员更倾向于使用BeanFactory接口的子接口,例如ApplicationContext接口或ListableBeanFactory接口。这些接口提供了更加便捷的Bean管理和依赖注入功能,可以大大提高开发效率。

2.ListableBeanFactory

ListableBeanFactory是Spring Framework提供的一个接口,它继承了BeanFactory接口,并添加了一些额外的方法,用于获取容器中的Bean对象。ListableBeanFactory接口定义了以下方法:

  1. getBeanDefinitionCount():获取容器中Bean定义的数量。
  2. getBeanDefinitionNames():获取容器中所有Bean定义的名称。
  3. getBeanNamesForType():获取指定类型的所有Bean定义的名称。
  4. getBeansOfType():获取指定类型的所有Bean对象。
  5. getBeanNamesForAnnotation():获取被指定注解标注的所有Bean定义的名称。
  6. getBeansWithAnnotation():获取被指定注解标注的所有Bean对象。

ListableBeanFactory接口的实现类可以通过ApplicationContext接口来获取,例如:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
ListableBeanFactory beanFactory = context.getBeanFactory();

在这个例子中,通过ClassPathXmlApplicationContext类创建了一个Spring容器,并通过getBeanFactory()方法获取了该容器的ListableBeanFactory实现类。

ListableBeanFactory接口提供了一些方便的方法,可以用于检查和获取容器中的Bean对象。例如,getBeanDefinitionNames()方法可以获取容器中所有Bean定义的名称;getBeansOfType()方法可以获取指定类型的所有Bean对象。这些方法可以帮助开发人员对容器中的Bean对象进行统计、查询和管理。

需要注意的是,ListableBeanFactory接口并不是BeanFactory接口的替代品,它只是对BeanFactory接口进行了扩展。 在实际开发中,开发人员可以根据需要选择使用BeanFactory接口或ListableBeanFactory接口。如果需要获取容器中的所有Bean对象,或者需要根据类型或注解查询Bean对象,就应该使用ListableBeanFactory接口。

3.HierarchicalBeanFactory

HierarchicalBeanFactory是Spring Framework提供的一个接口,它继承了BeanFactory接口,并添加了一些额外的方法,用于处理父子容器之间的Bean对象关系。HierarchicalBeanFactory接口的实现类包括:DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。

HierarchicalBeanFactory接口定义了以下方法:

  1. getParentBeanFactory():获取当前容器的父容器。
  2. containsLocalBean(String name):判断当前容器是否包含指定名称的Bean对象。
  3. getBean(String name, Class<T> requiredType, Object[] args):根据名称、类型和构造参数获取Bean对象。
  4. getParent():获取当前容器的父容器。
  5. containsBean(String name):判断当前容器及其父容器中是否包含指定名称的Bean对象。

HierarchicalBeanFactory接口的实现类可以通过ApplicationContext接口来获取,例如:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
HierarchicalBeanFactory beanFactory = (HierarchicalBeanFactory) context.getBeanFactory();

在这个例子中,通过ClassPathXmlApplicationContext类创建了一个Spring容器,并通过getBeanFactory()方法获取了该容器的BeanFactory实现类,然后将其转换为HierarchicalBeanFactory接口类型。

HierarchicalBeanFactory接口是BeanFactory接口的扩展,它可以处理父子容器之间的Bean对象关系。在Spring Framework中,可以使用父子容器来实现Bean对象的层次结构,从而更好地管理Bean对象和依赖关系。HierarchicalBeanFactory接口提供了一些方法,可以用于获取父容器、判断容器中是否包含指定名称的Bean对象等操作,方便开发人员进行容器的管理和维护。

需要注意的是,HierarchicalBeanFactory接口并不是所有Spring容器都支持的接口。只有一些特定的容器,例如XmlBeanFactory和ApplicationContext等,才支持HierarchicalBeanFactory接口。如果需要使用HierarchicalBeanFactory接口的功能,需要使用支持该接口的容器。

4.ApplicationContext

ApplicationContext是Spring Framework提供的一个接口,它继承了BeanFactory接口,并添加了一些额外的功能,例如消息国际化、事件发布、资源加载等。 ApplicationContext接口的 实现类包括:ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、AnnotationConfigApplicationContext等。

ApplicationContext接口定义了以下方法:

  1. getBean(String name):根据名称获取Bean对象。
  2. getBean(String name, Class requiredType):根据名称和类型获取Bean对象。
  3. getBean(Class requiredType):根据类型获取Bean对象。
  4. containsBean(String name):判断容器中是否包含指定名称的Bean对象。
  5. getApplicationName():获取应用程序名称。
  6. getMessage(String code, Object[] args, String defaultMessage, Locale locale):获取国际化消息。
  7. publishEvent(ApplicationEvent event):发布应用程序事件。
  8. getResource(String location):获取资源。

ApplicationContext接口的实现类可以通过不同的方式来创建,例如通过XML配置文件、Java配置类或注解等方式。例如:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

在这个例子中,通过ClassPathXmlApplicationContext类创建了一个Spring容器,它会读取classpath下的applicationContext.xml文件,并根据该文件中的配置创建Bean对象。

ApplicationContext接口是Spring Framework中最常用的容器接口之一,它提供了更加便捷的Bean管理和依赖注入功能,可以大大提高开发效率。ApplicationContext接口除了继承了BeanFactory接口的基本功能外,还添加了一些额外的功能,例如国际化消息、事件发布、资源加载等。开发人员可以使用ApplicationContext接口来管理和维护Bean对象,同时也可以使用它的其他功能来实现更加丰富的应用程序功能。

需要注意的是,ApplicationContext接口是BeanFactory接口的扩展,因此它也继承了BeanFactory接口的所有功能。同时,ApplicationContext接口还提供了一些额外的功能,因此它通常会被开发人员优先选择使用。

二、常用的ApplicationContext的实现类

1.ClassPathXmlApplicationContext(基于XML配置)

ClassPathXmlApplicationContext是Spring Framework提供的一个实现ApplicationContext接口的类,它用于从classpath中加载XML配置文件,并创建Spring容器。 ClassPathXmlApplicationContext类继承了XmlApplicationContext类,因此它也支持从文件系统、URL、字节数组等方式加载XML配置文件。

ClassPathXmlApplicationContext类的构造函数有多种重载方式,最常见的是只传入一个String类型的参数,该参数表示classpath下的XML配置文件路径。例如:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

在这个例子中,ClassPathXmlApplicationContext类会在classpath下查找名为applicationContext.xml的XML配置文件,并根据该文件中的配置创建Spring容器。

ClassPathXmlApplicationContext类在创建Spring容器时会自动读取指定的XML配置文件,并根据文件中的配置创建Bean对象。开发人员可以在XML配置文件中定义Bean对象及其依赖关系,并使用Spring容器来管理和维护这些Bean对象。同时,ClassPathXmlApplicationContext类还提供了一些配置选项,例如是否自动刷新容器、是否启用AOP等,可以根据需要进行设置。

需要注意的是,ClassPathXmlApplicationContext类只是Spring Framework中创建容器的一种方式,开发人员可以根据需要选择不同的实现方式,例如使用AnnotationConfigApplicationContext类创建基于注解的配置容器,或使用WebApplicationContext类创建Web应用程序容器等。

2.AnnotationConfigApplicationContext(基于注解)

AnnotationConfigApplicationContext是Spring Framework提供的一个实现ApplicationContext接口的类,它用于基于注解的配置方式创建Spring容器。 AnnotationConfigApplicationContext类可以通过Java类来定义Bean对象及其依赖关系,而无需使用XML配置文件。

AnnotationConfigApplicationContext类的构造函数有多种重载方式,最常见的是只传入一个Class类型的参数,该参数表示使用注解配置的Java类。例如:

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

在这个例子中,AnnotationConfigApplicationContext类会读取名为AppConfig的Java类,并根据该类中的注解配置创建Spring容器。

AnnotationConfigApplicationContext类支持以下几种注解:

  1. @Configuration:用于标注配置类,指示该类包含Bean对象的定义。
  2. @Bean:用于标注方法,指示该方法返回一个Bean对象。
  3. @Import:用于导入其他配置类。

AnnotationConfigApplicationContext类可以通过Java类来定义Bean对象及其依赖关系,而无需使用XML配置文件。开发人员可以在Java类中使用注解来定义Bean对象及其依赖关系,并使用AnnotationConfigApplicationContext类来创建Spring容器。AnnotationConfigApplicationContext类还提供了一些配置选项,例如是否自动刷新容器、是否启用AOP等,可以根据需要进行设置。

需要注意的是,AnnotationConfigApplicationContext类只是Spring Framework中创建容器的一种方式,开发人员可以根据需要选择不同的实现方式,例如使用ClassPathXmlApplicationContext类创建基于XML配置的容器,或使用WebApplicationContext类创建Web应用程序容器等。

三、Spring Boot执行IoC的工作流程

Spring Boot是基于Spring Framework的开发框架,它通过自动配置和约定大于配置的方式,简化了Spring应用程序的开发和部署。在Spring Boot中,执行IoC的工作原理和Spring Framework基本相同,主要分为以下几个步骤:

  1. 扫描类路径:Spring Boot会自动扫描应用程序的类路径,查找带有@Component、@Service、@Repository等注解的类,并将它们注册为Spring容器中的Bean对象。

  2. 创建Bean对象:Spring Boot会根据类的注解和依赖关系,创建Bean对象,并将它们注册到Spring容器中。

  3. 自动装配:Spring Boot会自动装配Bean对象之间的依赖关系,通过@Autowired注解或构造函数注入等方式,将一个Bean对象注入到另一个Bean对象中。

  4. 全局配置:Spring Boot提供了一些全局配置,例如数据库连接、日志输出等,可以通过application.properties或application.yml等配置文件来进行配置。

  5. 自定义配置:开发人员可以通过@Configuration注解和@Bean注解,自定义配置类和Bean对象,并将它们注册到Spring容器中。

  6. 运行时环境:Spring Boot可以根据不同的运行时环境,自动加载不同的配置文件,并为应用程序提供不同的功能。例如,在开发环境中,可以启用热部署和调试模式,在生产环境中,可以启用性能优化和安全加固等。

总之,Spring Boot执行IoC的工作原理和Spring Framework基本相同,它通过自动配置和约定大于配置的方式,简化了Spring应用程序的开发和部署。开发人员只需要定义好Bean对象和依赖关系,Spring Boot就会自动完成Bean的创建和装配,大大提高了开发效率。

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

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

相关文章

[Android]使用jni实现高斯模糊

1.高斯模糊的原理&#xff1a; 根据周边的像素值来确定自己的像素值&#xff0c;平均值&#xff0c;最大值&#xff0c;最小值&#xff0c;正太分布值 2.均值模糊blur 函数声明&#xff1a; CV_EXPORTS_W void blur( InputArray src, OutputArray dst,Size ksize, Point anc…

python绘制分组条形图

文章目录 数据导入多组条形图堆叠条形图 数据导入 我们经常会遇到对比多个统计量随时间变化的图像&#xff0c;比如想知道中国、美国以及欧盟最近几年GDP变化&#xff0c;如下表所示&#xff0c;单位是万亿美元。 中国美国欧盟201813.8920.5315.98201914.2821.3815.69202014.…

转换或是克隆的虚拟机无法联网,网络服务无法启动

新转换的虚拟机&#xff0c;无法联网&#xff0c;启动网络服务&#xff0c;报错&#xff1a; systemctl start network.service job for network.service failed because the control process exited with error code. 查看网络服务状态&#xff0c;systemctl status network…

SpringMVC 中的控制器如何处理文件上传

SpringMVC 中的控制器如何处理文件上传 Spring MVC 是一个基于 Java 的 Web 框架&#xff0c;它是 Spring 框架的一部分&#xff0c;提供了一系列的组件和工具&#xff0c;帮助开发人员构建 Web 应用程序。其中&#xff0c;控制器是 Spring MVC 中的核心组件之一&#xff0c;它…

SpringMVC 中的控制器如何返回 JSON 数据

SpringMVC 中的控制器如何返回 JSON 数据 SpringMVC 是一个基于 Spring 框架的 Web 框架&#xff0c;它提供了一种方便的方式来处理 HTTP 请求和响应。在 SpringMVC 中&#xff0c;控制器是用来处理请求的组件&#xff0c;它们负责接收请求、处理请求并返回响应。在本文中&…

三大城市分会场精彩呈现—2023架构·可持续未来峰会圆满收官!

2023年6月30日&#xff0c;由The Open Group主办的2023架构可持续未来峰会三大城市分会场成功举办&#xff0c;也代表着本次The Open Group半年度架构峰会圆满收官&#xff01; 本次大会以“可持续未来”为主题&#xff0c;采用“13”&#xff0c;即北京主会场上海/成都/深圳三…

svg修改图标颜色

对于svg图标&#xff0c;想通过hover或者active 添加颜色&#xff0c;没有办法修改&#xff0c;解决办法&#xff1a; 1. 修改svg图片源 最开始的svg图标&#xff1a; 修改这个fill"currentColor" 要是要修改线条颜色就修改stroke属性&#xff1a; fill属性设置对象…

青岛大学_王卓老师【数据结构与算法】Week05_02_栈的定义和特点_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c; 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础…

这所985太好考了,专硕06方向仅刷一人,其余过线全收!

一、学校及专业介绍 东北大学&#xff08;Northeastern University&#xff09;位于辽宁省沈阳市&#xff0c;是中华人民共和国教育部直属全国重点大学。它是国家“双一流”建设高校、国家“211工程”和“985工程”重点建设高校&#xff0c;全国首批博士、硕士学位授予单位。 …

10.12UEC++/结构体和枚举

1.结构体&#xff1a; 定义&#xff1a; 类中创建对象&#xff1b; UE4中使用&#xff1a; 也可以定义一个结构体类型的变量&#xff1a; 结构体成员想要在细节面板中调整时&#xff0c;也需要每个都加上UPropPerty指令宏才可以&#xff1a; 此时该变量没有break功能&#xff0…

Seal AppManager v0.2 发布:进一步简化应用部署体验

经过近3个月的研发&#xff0c;Seal AppManager v0.2 已正式发布。 Seal AppManager 是一款基于平台工程理念的应用统一部署管理平台&#xff0c;于今年4月首次推出。在上一版本中&#xff0c;我们已经释出集成 ChatGPT 简化服务模板代码生成、云成本可视化、动态环境管理等功…

用html+javascript打造公文一键排版系统2:显示源码/显示预览、清除格式

我们从实现最简单、最基本的功能开始。 一、显示源码/显示预览 我们通过btnShowSrc来实现示源码/显示预览功能&#xff0c;根据btnShowSrc.value来判断<iframe>的显示的内容并切换。 <iframe>默认为显示预览&#xff0c;所以btnShowSrc.value值为“显示源码”&a…

Flink DataStream之Connect合并流

新建类 package test01;import org.apache.flink.configuration.Configuration; import org.apache.flink.streaming.api.datastream.ConnectedStreams; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastre…

flutter开发实战-指纹、面容ID验证插件实现

flutter开发实战-指纹、面容ID验证插件实现 在iOS开发中&#xff0c;经常出现需要指纹、面容ID验证的功能。 指纹、面容ID是一种基于用生物识别技术&#xff0c;通过扫描用户的面部特征来验证用户身份。 一、效果图 二、iOS指纹、面容ID验证 在iOS中实现指纹、面容ID验证功能…

一同感受C++模版的所带来的魅力

文章目录 一、泛型编程思想二、函数模版1、函数模板概念2、函数模板格式3、函数模板的原理4、函数模板的实例化5、模板参数的匹配原则 三、类模版1、类模板的定义格式2、类模板的实例化 四、总结与提炼 一、泛型编程思想 首先我们来看一下下面这三个函数&#xff0c;如果学习过…

磁盘与文件系统管理

磁盘结构及分区表示 硬盘 Hard Disk Drive &#xff0c;简称 HDD 是计算机常用的存储设备之一。 1 磁盘基础 1.1 硬盘的结构 1.1.1 数据结构 ①扇区&#xff1a;磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区(Sector)。硬盘的第一个扇区&#xff0c;叫做引导…

【mysql】-【锁】

文章目录 概述MySQL并发事务访问相同记录读-读情况写-写情况读-写或写-读情况并发问题的解决方案 锁的不同角度分类 概述 事务的隔离性由这章讲述的锁来实现。 MySQL并发事务访问相同记录 并发事务访问相同记录的情况大致可以划分为3种: 读-读情况 读-读情况&#xff0c;…

使用vite创建vue3的Cesium基础项目

使用vite创建vue3的Cesium基础项目 使用vite创建vue3项目&#xff1a;可以参考官方文档Vite官方中文文档 1.1 在指定文件夹路径下使用npm&#xff08;前提是已经安装好了node&#xff09;&#xff1a; bash npm create vitelatest 1.2 cd到创建的项目文件夹&#xff1a; bash c…

符号化的正确姿势

GUI方式 将 .ips crash report 文件拖放到 Xcode > Window > Devices and Simulators > View Device Logs中, 然后导出 .crash 符号化文件. 使用条件: crash report 对应的 Archive 包是在本机构建的 symbolicatecrash symbolicatecrash 是一个 exec (可执行文件), …