【Spring Boot】自动配置及重要注解解析

这篇具有很好参考价值的文章主要介绍了【Spring Boot】自动配置及重要注解解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、自动配置及原理

1、springboot自动配置了哪些功能

1)tomcat的自动配置

引入了tomcat的相关依赖
【Spring Boot】自动配置及重要注解解析

2)自动配置springmvc及常用功能

我们在主启动类中加两行代码,查看一下spring boot加载了哪些组件
【Spring Boot】自动配置及重要注解解析
通过在控制台输出中搜索,我们可以发现转发请求的dispatcherServlet、解决乱码的characterEncodingFilter还有视图解析器ViewResolver都已经被自动加载

3)默认的包结构

主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来,无需向之前那样专门去配置
如果想调整包扫描路径,可以将主启动类中的@SpringBootApplication注解替换成
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
然后再@ComponentScan后面指定自己想要的包扫描路径

4)各种配置都具有默认值

我们可以简单看下各个配置的默认值
默认配置最终都是映射到某个类上,这个类会在容器中创建对象
【Spring Boot】自动配置及重要注解解析

5)按需加载所有的自动配置项

并非所有的自动配置项都会加载,只有我们引入了对应的启动器,才会自动加载相应的自动配置项
SpringBoot所有的自动配置功能都在spring-boot-autoconfigure这个jar包里面

2、注解分析

1)底层注解分析
  • @Configuration:标注当前类是一个配置类,可以使用@Configuration+@Bean的方式注册bean到spring boot的IOC容器中,默认是单实例的,可参考我之前的博客 【Spring】使用JavaConfig实现配置
    • 此注解新加了一个属性proxyBeanMethods,默认开启
    • 如果此属性为true,那么每次@Bean方法被调用多少次返回的组件都是单实例的,如果是false,那么保证每个@Bean方法被调用多少次返回的组件都是新创建的
    • 如果bean之间存在组件依赖必须使用Full模式(proxyBeanMethods=true),其他默认使用Lite模式(proxyBeanMethods=false)
  • @Import:在IOC容器中自动创建出引入类型的bean,默认bean的名字就是全类名
  • @ConditionalOnProperty(xxx):判断括号内的配置是否存在且配在auto配置且值为true就生效,你没配我也认为配了
  • @Conditional:条件装配,满足Conditional指定的条件,则进行bean注入,它有很多子类
    【Spring Boot】自动配置及重要注解解析
  • @ImportResource:用于导入 Spring 的 xml 配置文件,将该配置文件中定义的 bean 对象加载到Spring容器中,在配置类上使用
  • 想要将配置文件中的配置与类进行绑定,可以使用下面两种组合的注解
    • @ConfigurationProperties(prefix=“xxx”)+@Component:配置绑定,使用在实体类上,prefix前缀的值为配置文件中配置项的前缀
    • @EnableConfigurationProperties(xxx.class)+@ConfigurationProperties
      @EnableConfigurationProperties使用在配置类上,括号内填需要绑定配置的实体类,它的作用是使得@ConfigurationProperties注解生效,将括号内的bean注册到容器中
      @ConfigurationProperties使用在实体类上,这个注解通常是用来将properties和yml配置文件属性转化为bean对象使用
2)主启动类核心注解

主启动类中的@SpringBootApplication就等于@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan

  • @SpringBootConfiguration,继续深入可以发现它就是@Configuration注解修饰的,表示这个类就是一个配置类

  • @EnableAutoConfiguration

    • @AutoConfigurationPackage
      继续深入可以发现,这个注解上面有一个@Import({Registrar.class})注解,作用就是将Register注册到组件中
      Register类里有一个方法可以批量注册bean,我们使用debug模式看一下传进来的元数据,这样就可以理解为什么Spring boot可以不用配置自动扫描了,因为它将启动类所在包下的类都注册到容器中了
      【Spring Boot】自动配置及重要注解解析

    • @Import({AutoConfigurationImportSelector.class})
      这个类和spring boot导入自动配置类有关,框架启动时会加载所有的配置类(关键文件META-INF下的spring.factories),但是因为条件装配规则(即@Conditional相关注解)的存在,这些自动配置会按需生效
      【Spring Boot】自动配置及重要注解解析
      【Spring Boot】自动配置及重要注解解析
      【Spring Boot】自动配置及重要注解解析
      上面这个方法会去我们引入的jar包下找META-INF/spring.factories文件,如果有
      org.springframework.boot.autoconfigure.EnableAutoConfiguration修饰的类,就会加载进来
      【Spring Boot】自动配置及重要注解解析
      注意,从spring boot2.7开始,慢慢不支持META-INF/spring.factories文件了
      需要导入的自动配置类可以放在
      /META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中,可以看下spring-boot-autoconfigure-2.7.0.jar下的这个文件

  • @ComponentScan:指定扫描哪些类,将其注册到容器中

3、自动配置实现原理

那么问题来了,spring boot是如何做到让我们免去那么多麻烦的配置的呢?
我们可以看一下DispatcherServletAutoConfiguration和HttpEncodingAutoConfiguration的源码
【Spring Boot】自动配置及重要注解解析

【Spring Boot】自动配置及重要注解解析
我们可以发现,spring boot在底层都帮我们预先配置了所有的组件,但是会以用户自己配置的优先
如果用户没有配,那么就默认把框架默认配置好的bean注册到容器中

4、SpringBootApplication类

首先我们先跟进run方法看下,发现在调用run之前,程序调用了SpringApplication类的构造方法
【Spring Boot】自动配置及重要注解解析
然后我们看下构造器里面做了什么
首先他判断当前项目是否为web项目(是否包含SpringBootWeb的相关依赖)
【Spring Boot】自动配置及重要注解解析
【Spring Boot】自动配置及重要注解解析
然后就是看一下接下来的getSpringFactoriesInstances()方法
这里面有一个SpringFactoriesLoader.loadFactoryNames(type, classLoader)方法
【Spring Boot】自动配置及重要注解解析
跟进去看一下,发现他会去每个依赖下读META-INF/spring.factories文件(自动装配的核心文件)
【Spring Boot】自动配置及重要注解解析
如果发现有当前接口类的实现类,就会统一放在list集合中返回
【Spring Boot】自动配置及重要注解解析
接着就根据上一步的返回结果,调用相关方法初始化相关bean的实例,进行排序后返回实例
【Spring Boot】自动配置及重要注解解析

总结:

  • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。它会去xxxxProperties里面拿,而xxxProperties和配置文件进行了绑定
  • 生效的配置类就会给容器中装配很多组件
  • 只要容器中有这些组件,相当于这些功能就有了
  • 定制化配置
    • 直接自己@Bean替换底层的组件
    • 查看这个组件获取配置文件是哪个,就去application.properties或者yaml文件中修改对应的配置项

如有错误,欢迎指正!!文章来源地址https://www.toymoban.com/news/detail-405552.html

到了这里,关于【Spring Boot】自动配置及重要注解解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 深入解析Spring Boot中的注解@PathVariable、@RequestParam、@RequestBody的正确使用

    深入解析Spring Boot中的注解@PathVariable、@RequestParam、@RequestBody的正确使用

    🎉深入解析Spring Boot中的注解@PathVariable、@RequestParam、@RequestBody的正确使用 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:架构设计 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平

    2024年02月04日
    浏览(9)
  • Spring Boot源码解析 - 自动装配原理

    Spring Boot源码解析 - 自动装配原理

    Spring Boot 自动装配是 Spring Boot 框架的一个关键特性,它的目标是让开发者能够快速构建 Spring 应用程序,减少繁琐的配置工作。   @SpringApplication 从启动类 @SpringApplication 注解入手, @SpringBootApplication 是一个组合注解,它是 Spring Boot 框架中常用的一个主要注解之一。它结合了

    2024年01月19日
    浏览(19)
  • Spring属性注解对配置项名称的自动转换

           在Spring中,我们经常需要将配置文件中的属性值注入到Java类中。Spring提供了两个主要的注解来实现这一功能: @Value 和 @ConfigurationProperties 。其中 @ConfigurationProperties 支持将配置项名称与Java类中的属性名进行自动转换,包括 \\\' - \\\' 和\\\' 驼峰命名 \\\'的转换;而 @Value 不支

    2024年02月15日
    浏览(7)
  • 【Spring Boot 源码学习】自动装配流程源码解析(下)

    【Spring Boot 源码学习】自动装配流程源码解析(下)

    《Spring Boot 源码学习系列》 上篇博文,笔者带大家了解了自动装配流程中有关自动配置加载的流程; 本篇将介绍自动装配流程剩余的内容,包含了自动配置组件的排除和过滤、触发自动配置事件。 在开始本篇的内容介绍之前,我们先来看看往期的系列文章【有需要的朋友,

    2024年02月11日
    浏览(14)
  • 【Spring Boot 源码学习】自动装配流程源码解析(上)

    【Spring Boot 源码学习】自动装配流程源码解析(上)

    《Spring Boot 源码学习系列》 上篇博文,笔者带大家从整体上了解了AutoConfigurationImportSelector 自动装配逻辑的核心功能及流程,由于篇幅有限,更加细化的功能及流程详解还没有介绍。本篇开始将从其源码入手,重点解析细化后的自动装配流程源码。 在开始本篇的内容介绍之前

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

    Spring Boot——Spring Boot自动配置原理

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

    2024年02月15日
    浏览(6)
  • Spring Boot 属性配置解析

    Spring Boot 属性配置解析

    基于Spring Boot 3.1.0 系列文章 Spring Boot 源码阅读初始化环境搭建 Spring Boot 框架整体启动流程详解 Spring Boot 系统初始化器详解 Spring Boot 监听器详解 Spring Boot banner详解 Spring Boot 3.1.0 支持的属性配置方式与2.x版本没有什么变动,按照以下的顺序处理,后面的配置将覆盖前面的配置

    2024年02月09日
    浏览(11)
  • 【Spring Boot】掌握Spring Boot:深入解析配置文件的使用与管理

    【Spring Boot】掌握Spring Boot:深入解析配置文件的使用与管理

    💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Spring Boot】掌握Spring Boot:深入解析配置文件的使用与管理 🎉欢迎大家点赞👍评论📝收藏⭐文章 配置文件主要是为了解决硬编码带来的问题,把可能会发生改变的信息,放在⼀个集中的地方,当我们启 动某个程序时,应用程

    2024年04月23日
    浏览(10)
  • spring boot 自动配置

    spring boot 自动配置

    自动配置介绍 Spring Boot自动装配(Auto Configuration)是Spring Boot框架的一个关键特性,它通过约定大于配置的方式来简化项目的配置过程。自动装配允许开发人员使用默认的配置,同时也可以根据需要进行定制化。Spring通过使用 @Autowired 注解、 @ComponentScan 注解以及条件化配置等

    2024年01月25日
    浏览(10)
  • Spring Boot自动配置原理

    Spring Boot自动配置原理

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

    2024年01月19日
    浏览(9)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包