Spring Boot原理分析(二):IoC

news2024/11/24 4:09:09

文章目录

  • 〇、IoC思想和IoC容器
    • IoC体现了什么思想
    • 什么是IoC容器
  • 一、Spring IoC容器的继承层次
    • 1.BeanFactory
    • 2.ListableBeanFactory
    • 3.HierarchicalBeanFactory
    • 4.ApplicationContext
    • 5.常用的ApplicationContext的实现类
      • ClassPathXmlApplicationContext(基于XML配置)
      • AnnotationConfigApplicationContext(基于注解)

〇、IoC思想和IoC容器

IoC体现了什么思想

IoC(Inversion of Control)是一种软件设计原则,它体现了控制反转的思想。传统的程序设计中,对象之间的依赖关系由开发者在代码中直接管理,即对象自己创建和管理它所依赖的对象。而在IoC的思想下,控制权被反转,对象的创建和管理由容器来负责,对象只需要声明它所依赖的其他对象,容器会自动注入这些依赖。

IoC的核心思想是将对象之间的依赖关系交给容器来管理,通过配置文件或注解等方式告诉容器哪些对象需要被创建和注入,容器会根据配置信息自动创建对象,并将依赖注入到相应的位置。这样可以降低对象之间的耦合度,提高代码的可维护性和可扩展性。

什么是IoC容器

IoC(Inversion of Control)容器是一个软件组件,用于管理和组织应用程序中的对象和依赖关系。它实现了控制反转(Inversion of Control)的概念,即将对象的创建和依赖关系的管理交给容器来完成,而不是由开发人员手动管理。

通过使用IoC容器,开发者可以将关注点从对象的创建和依赖管理中解脱出来,更专注于业务逻辑的实现。同时,IoC容器也提供了更灵活的配置方式,可以根据不同的环境和需求进行配置,使系统更易于扩展和维护。

IoC容器的主要功能包括:

  1. 对象的实例化和生命周期管理: IoC容器负责创建对象的实例,并管理对象的生命周期,包括对象的初始化、依赖注入和销毁等操作。
  2. 依赖关系的管理: IoC容器负责管理对象之间的依赖关系,通过依赖注入的方式将依赖的对象注入到目标对象中。
  3. 配置的集中管理: IoC容器通过配置文件或注解等方式,集中管理应用程序中的各种配置信息,包括对象的创建方式、依赖关系的配置等。
  4. AOP(Aspect-Oriented Programming)的支持: IoC容器通常也提供了对AOP的支持,可以通过配置方式实现横切关注点的管理。

在Spring框架中,IoC容器被称为ApplicationContext,它是Spring框架的核心部分。通过配置文件或注解等方式,开发人员可以将对象的创建和依赖关系的管理交给Spring容器来完成,从而实现松耦合、可维护和可测试的应用程序。

一、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接口还提供了一些额外的功能,因此它通常会被开发人员优先选择使用。

5.常用的ApplicationContext的实现类

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应用程序容器等。

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应用程序容器等。

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

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

相关文章

FreeRTOS详细目录结构和作用

FreeRTOS各个目录的功能简介 1. Demo目录&#xff1a;这个目录下主要包含了大量官方支持的微控制器和不同平台上的项目&#xff0c;包括常用的stm32和keil平台下进行开发的项目。我主要使用的是CORTEX_STM32F103_Keil和common两个目录&#xff0c;对系统进行精简的话可以只保留…

光伏行业中的设备自动化系统EAP:优化生产流程的重要工具

随着清洁能源的需求不断增长&#xff0c;光伏行业作为可再生能源的重要组成部分&#xff0c;正迅速发展。为了满足日益增长的市场需求&#xff0c;光伏企业需要提高生产效率、降低成本&#xff0c;并保证产品的质量和可靠性。 图.光伏面板&#xff08;pexels&#xff09; 在这…

校园跑腿小程序怎么做

校园跑腿小程序是为了方便学生在校园内解决各类需求而设计的一款应用程序。该小程序具有多种功能&#xff0c;包括校园跑腿、二手市场、骑手接单、校园表白墙、下单支付、学校代理以及佣金抽成等。 1. 校园跑腿&#xff1a; 该小程序提供校园内的跑腿服务&#xff0c;学生可以…

【开源项目】中后台开发框架vue-admin-work-pro

vue-admin-work-pro 基本介绍 基于Vue3、Vite、TypeScript、NaiveUI、Vuex等最新技术栈开发的开箱即用的中后台前端框架。 内置常用模板&#xff0c;无需考虑交互排版&#xff0c;助你高效开发样式美观大方&#xff0c;无缝对接 Naive Ui&#xff0c;随意组合页面&#xff0c…

ME GO小车

ME GO小车 ⚫ 体积小巧 ⚫ 集成多种传感器和执行器 ⚫ Mixly图形化编程 避障检测、自动巡线、灯光显示、 声音报警、自动测距、物联遥控等 ME GO小车——俯视图 ME GO小车——车底 ME GO CE 以上选自芯”向未来 元控智联挑战赛&#xff08;小学组&#xff09;赛事介绍资料二…

操作系统Linux—day03

操作命令 搜索文件 find命令 1按照文件名称搜索 语法&#xff1a;find [路径] -name “文件名 ” -print 打印出所有查找文件名的路径 2按照更新时间搜索 语法&#xff1a; find [路径] -mtime 3 -print 查找更改时间为3天前的文件&#xff0c;3表示3天前&#xff0c;-3…

python 第三方包安装

1 MAC 打开终端 ,证明安装上python了 2 直接输入 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark 其中 python3. 多的版本 需要 pip3 也可以直接用 pip 试一试 -i https://pypi.tuna.tsinghua.edu.cn/simple : 为 国内镜像地址 pyspark 第三方包

苹果pencil和普通的有什么区别?ipad第三方电容笔推荐

苹果原装电容笔和那种只具备倾斜压感的平替电容笔不一样&#xff0c;平替电容笔并没有具备重力压感。但是&#xff0c;如果你并不经常需要绘画的话&#xff0c;那么你也不必花费太多的金钱来购买一支价格如此贵的苹果电容笔&#xff0c;选择一款平替电容笔即可。在这里&#xf…

c++11 标准模板(STL)(std::basic_istream)(六)

定义于头文件 <istream> template< class CharT, class Traits std::char_traits<CharT> > class basic_istream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式…

阿里云容蓓:DCDN 助力云原生时代的应用构建及最佳实践

在数字化转型速度不断提升的今天&#xff0c;大带宽、低时延、高并发的场景不断涌现&#xff0c;内容分发网络(Content Delivery Network&#xff0c;CDN)应用需求还在不断攀升&#xff0c;打造更高质量的CDN服务将成为新时代产业竞争的关键所在。亚太CDN峰会自2012年第一届以来…

python_day7_画图

json数据与python字典的相互转换 import json列表&#xff0c;其中每个元素均为一个字典 data [{"name": "张三", "age": 10},{"name": "李四", "age": 13},{"name": "jay", "age&qu…

【论文阅读】Scaling Laws for Neural Language Models

前言 本文简要介绍 Scaling law 的主要结论原文地址&#xff1a;Scaling Laws for Neural Language Models个人认为不需要特别关注公式内各种符号的具体数值&#xff0c;而更应该关注不同因素之间的关系&#xff0c;比例等 Summary Performance depends strongly on scale, w…

windows安装netcat

netcat 就是 nc netcat官网&#xff1a;https://eternallybored.org/misc/netcat/ 将下载的netcat解压到C:\Program Files重命名为netcat &#xff08;安装位置自定义&#xff09; 配置一下环境变量&#xff0c;让nc命令可以在任何地方使用 在系统变量中加入netcat的启动路径 …

【面试题37】优化MYSQL数据库的方法有哪些

文章目录 一、前言二、优化的方向2.1 数据库设计优化2.2 查询优化2.3 硬件优化2.4 配置优化2.5. 定期维护和监控 三、MySQL查询优化的一些方向3.1 使用索引3.2 优化查询语句3.3 避免使用SELECT *3.4 分析查询计划3.5 设置合适的缓存大小3.6 分区表3.7 使用连接池3.8 定期优化数…

记录一组excel函数-将同一个id的多组数据整合到一格并用逗号隔开

初始数据如上图&#xff0c;用函数整理成下图 主要涉及两点&#xff1a;去重和集合 1.去重&#xff1a; 方法1: UNIQUE函数 使用方法&#xff1a;输入函数UNIQUE&#xff08;范围1:范围2&#xff09; 方法2:数据->删除重复项 使用方法&#xff1a;选中需要删除重复项的列&a…

Android :Activity生命周期

MainActivity .java import android.app.Activity; import android.os.Bundle; import android.util.Log; import java.util.function.LongToDoubleFunction; public class MainActivity extends Activity { //日志标记 private String TAG this.getClass().getSimpleNa…

Jenkins持续集成:使用Gerrit Trigger插件实现代码提交自动验证

Gerrit Trigger插件集成了Gerrit代码审查&#xff0c;当创建一个“patch set”时触发Jenkins构建&#xff0c;本文档介绍Gerrit Trigger插件配置及使用方法。 目录 安装Gerrit Trigger插件Gerrit 访问权限配置Jenkins Gerrit Server配置Gerrit Trigger配置 安装Gerrit Trigger插…

深入理解Linux网络——本机网络IO

文章目录 一、相关实际问题二、跨机网络通信过程1&#xff09;跨机数据发送2&#xff09;跨机数据接收3&#xff09;跨机网络通信汇总 三、本机发送过程1&#xff09;网络层路由2&#xff09;网络设备子系统3&#xff09;驱动程序 四、本机接收过程五、问题解答 系列文章&#…

什么是Heatmap(热图)图表?用DHTMLX可实现快速构建

DHTMLX Chart是DHTMLX最新发布的JavaScript UI小部件库的核心内容之一&#xff0c;这个图表小部件收到了几个重要的更新&#xff0c;但其中最引人注目的是一个新的数据可视化选项——日历热图。 DHTMLX专注于JavaScript和HTML5 UI小部件和库&#xff0c;以帮助开发人员更快地构…

【ThinkPHP】实现一个逆向工程生成model

ThinkPHP为了节省一些重复的步骤&#xff0c;写了个简单版的生成model的工具&#xff0c;逆向生成model代码&#xff0c;节省时间&#xff0c;专注写业务代码。 ThinkPHP中的命令行也提供了一些生成代码的命令&#xff1a; make:controller 创建控制器 make:model 创建模型 m…