Spring Boot原理分析(二):IoC

这篇具有很好参考价值的文章主要介绍了Spring Boot原理分析(二):IoC。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

〇、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容器的继承层次如下:

Spring Boot原理分析(二):IoC,smart Spring,spring boot,java,后端

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应用程序容器等。文章来源地址https://www.toymoban.com/news/detail-555810.html

到了这里,关于Spring Boot原理分析(二):IoC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Spring Boot源码解读与原理分析》书籍推荐

    Spring Boot 1.0.0 早在2014年就已经发布,只不过到了提倡“降本增效”的今天,Spring Boot才引起了越来越多企业的关注。Spring Boot是目前Java EE开发中颇受欢迎的框架之一。依托于底层Spring Framework的基础支撑,以及完善强大的特性设计,Spring Boot已成为业界流行的应用和微服务开发

    2024年02月14日
    浏览(36)
  • Spring Boot原理分析 | SpringApplication、Yaml、Properties

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Spring开源框架,轻量级的Java开发框架,解决企业级应用开发的复杂性而创建,简化开发 基于POJO的轻量级和最小侵入型编程 通过IOC,依赖注入(DI)和面向接口实现松耦合 基于切面(AOP)和惯例进行声明式编程 通过切

    2024年02月12日
    浏览(42)
  • Spring Boot 集成 API 文档 - Swagger、Knife4J、Smart-Doc

    Swagger 作为 API 设计和文档的强大工具,是一个由专门的工具集合支持的框架,它在整个 API 的生命周期中发挥作用,从设计和文档,到测试和部署。通过提供可视化界面,Swagger 让开发人员和最终用户都能清晰地理解和操作 API。 使用建议:笔者建议优先考虑 Knife4J,它已经能

    2024年01月22日
    浏览(56)
  • Java企业级信息系统开发学习笔记(4.2)Spring Boot项目单元测试、热部署与原理分析

    该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/pG623】 1. 添加测试依赖启动器和单元测试 修改pom.xml文件,添加依赖 刷新项目依赖 2. 创建测试类与测试方法 在 src/test/java 里创建 cn.kox.boot 包,创建测试类 TestHelloWorld01 给测试类添加测试启动器注解与Spring

    2024年02月10日
    浏览(52)
  • Spring Boot——Spring Boot启动原理

    2.1.1Spring Boot入口 2.1.2初始化SpringApplication 准备阶段,在程序运行之前初始化一些属性,用于在后序启动应用程序过程中。 2.1.2.1判断当前应用程序类型 2.1.2.2设置应用程序的所有初始化器(initializers) 上面这段代码主要是通过加载 “spring.factories” 配置文件中指定类型的工厂名

    2024年02月15日
    浏览(46)
  • Spring Boot——Spring Boot自动配置原理

    Spring Boot启动原理 一直在使用Spring Boot特别好奇的是为什么Spring Boot比Spring在项目构建和开发过程中要方便很多,无需编写大量的配置,Spring Boot自动给你配置好了。往往是集成项目依赖之后一键使用。于是小编我就学习和研究了一下Spring Boot的自动配置。 主程序入口示例 :

    2024年02月15日
    浏览(36)
  • 【Spring Boot】Spring Boot源码解读与原理剖析

    承载着作者的厚望,掘金爆火小册同名读物《Spring Boot源码解读与原理剖析》正式出书! 本书前身是掘金社区销量TOP的小册——《Spring Boot源码解读与原理剖析》,整个社区中有3600+开发者都不约而同地选择了这本小册,也使它成为掘金社区首屈一指的王牌Spring教程,非常能打

    2024年02月08日
    浏览(39)
  • Spring Boot启动原理

    Spring Boot的自动配置为我们提供了快捷方便的方式来运行Spring应用,但很多开发者对其内部启动原理还不是很明白。这篇博客旨在解开Spring Boot的神秘面纱,帮助大家理解它的启动原理。 我们的Spring Boot应用通常从一个主类开始,这个类包含一个main方法,以及一些注解: @Sp

    2024年02月10日
    浏览(41)
  • Spring Boot工作原理

            Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。Spr

    2024年03月15日
    浏览(50)
  • Spring Boot自动配置原理

    springboot是基于spring的新型的轻量级框架,最厉害的地方当属**自动配置。**那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置 从上面代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,所以要揭开SpringBoot的神秘面纱

    2024年01月19日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包