首页 > 其他分享 >SpringBoot自动配置原理

SpringBoot自动配置原理

时间:2023-06-26 18:22:04浏览次数:35  
标签:SpringBoot springboot spring 配置 bean 自动 注解 原理 加载

SpringBoot自动配置

自动配置是SpringBoot的核心因素,SpringBoot在整合每一种第三方技术时,都离不开自动配置。但在了解自动配置之前,Spring容器如何进行对bean的加载以及加载控制也是一个非常重要的前提知识。

1. bean的加载方式

1.1 方式一:配置文件+<bean/>标签

最初级的bean的加载方式其实可以直击spring管控bean的核心思想,就是提供类名,然后spring就可以管理了。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--xml方式声明自己开发的bean-->
    <bean id="cat" class="com.example.bean.Cat"/>
    <bean class="com.example.bean.Dog"/>

    <!--xml方式声明第三方开发的bean-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/>
    <bean class="com.alibaba.druid.pool.DruidDataSource"/>
</beans>

1.2 方式二:配置文件扫描+注解定义bean

方式一需要将spring管控的bean全部写在xml文件中,这种方式并不是很友好,所以就有了第二种方式。哪一个类要受到spring管控加载成bean,就在这个类的上面加一个注解,还可以顺带起一个bean的名字(id)。这里可以使用的注解有@Component以及三个衍生注解@Service、@Controller、@Repository

@Component("tom")
public class Cat {
}

但上面这种方式仅仅只是对bean的声明,spring并没有“感知”到这些bean。因此需要通过下列xml配置设置spring去检查哪些包,发现了对应注解,就将对应的类纳入spring管控范围。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
    ">
    <!--指定扫描加载bean的位置-->
    <context:component-scan base-package="com.example.bean,com.example.config"/>
</beans>

1.3 方式三:注解方式声明配置类

方式三在方式二的基础上,使用Java类替换掉了在xml配置文件中写component-scan这种固定格式的配置。定义一个配置类并使用@ComponentScan替代原始xml配置中的包扫描这个动作,其实功能是基本相同的。

@ComponentScan({"com.example.bean","com.example.config"})
public class SpringConfig {
    @Bean
    public DogFactoryBean dog(){
        return new DogFactoryBean();
    }
}

总结:

  1. 本文的重点是了解SpringBoot自动配置的原理,因此只给出部分bean的加载方式以供参考学习;

  2. bean的定义由前期xml配置逐步演化成注解配置,本质是一样的,都是通过反射机制加载类名后创建对象对象就是spring管控的bean

2. bean的加载控制

企业级开发中不可能在spring容器中进行bean的饱和式加载的,也即不管用不用,全部进行加载。所以在spring容器中,通过判定是否加载了某个类来控制某些bean的加载是一种常见操作。

下面的例子使用@ConditionalOnClass注解实现了当识别到加载了com.example.bean.Wolf类时加载对应的bean。

@Bean
@ConditionalOnClass(name = "com.example.bean.Wolf")
public Cat tom(){
    return new Cat();
}

@ConditionalOnMissingClass注解控制当没有加载指定的类时才加载对应的bean。

@Bean
@ConditionalOnClass(name = "com.example.bean.Wolf")
@ConditionalOnMissingClass("com.example.bean.Mouse")
public Cat tom(){
    return new Cat();
}

还可以判定是否加载了指定名称的bean。比如当前容器中已经提供了jdbcTemplate对应的bean,此时就不需要再加载一个全新的jdbcTemplate的bean了。通过@ConditionalOnBean注解实现。

@Bean
@ConditionalOnBean(name="jerry")
public Cat tom(){
    return new Cat();
}

3. 自动配置工作流程

自动配置的意义就是加速开发效率,将开发者使用某种技术时需要使用的bean根据情况提前加载好,实现自动配置的效果。当然,开发者有可能需要提供一些必要的参数,比如要用mysql技术,导入了mysql的坐标,springboot就会将一系列的数据库操作相关的bean都提前声明好,但是需要开发者告诉springboot到底用哪一个数据库,即IP地址,端口等配置都需要通过配置文件告诉spirngboot,继而完成自动配置相关的工作。

3.1 核心原理

  1. springboot的开发人员先大量收集Spring开发者的编程习惯,整理开发过程每一个程序经常使用的技术列表,形成一个技术集A
  2. 收集常用技术(技术集A)的使用参数,得到开发过程中每一个技术的常用设置,形成每一个技术对应的设置集B
  3. springboot初始化Spring容器基础环境,读取用户的配置信息,加载用户自定义的bean和导入的其他坐标,形成初始化环境
  4. springboot将技术集A包含的所有技术在SpringBoot启动时默认全部加载,这时肯定加载的东西有一些是无效的,没有用的
  5. springboot会对技术集A中每一个技术约定出启动这个技术对应的条件,并设置成按条件加载,由于开发者导入了一些bean和其他坐标,也就是初始化环境,这个时候就可以根据这个初始化环境与springboot的技术集A进行比对了,哪个匹配上加载哪个
  6. 因为有些技术不做配置就无法工作,所以springboot开始对设置集B下手了。它统计出开发者使用某个技术时最常用的设置,然后把这些设置作为默认值直接设置好,这样可以减少开发者配置参数的工作量
  7. 但是默认配置不一定能解决问题,于是springboot开放修改设置集B的接口,可以由开发者根据实际需要决定是否覆盖默认配置

3.2 流程概述

自动配置就是自动把第三方的Bean加载到spring的IOC容器中去,不需要开发人员去手动的配置。自动配置其实从根本上来说就是一个bean的加载

  • 在springboot应用中,只需要在启动类上加入@SpringBootApplication注解,就可以去实现自动配置。@SpringBootApplication注解是一个复合注解,包括@EnableAutoConfiguration @Configuration @ComponentScan注解,三个注解的分别作用是:
    • @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
    • @Configuration:允许在上下文中注册额外的 bean 或导入其他配置类
    • @ComponentScan: 扫描被@Component 及其衍生注解(@Service,@Controller)注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean。
  • springboot启动时先加载spring.factories文件中的org.springframework.boot.autoconfigure.EnableAutoConfiguration配置项,将其中配置的所有的类都加载成bean;
  • @EnableAutoConfiguration注解是实现自动配置的核心注解,注解中通过AutoConfigurationImportSelector类来实现自动配置,这个类实现了ImportSelector接口,在该类中加载 META-INF/spring.factories 的配置信息,主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到IOC容器中去,从而完成自动配置。
springboot自动配置.png

标签:SpringBoot,springboot,spring,配置,bean,自动,注解,原理,加载
From: https://www.cnblogs.com/SnkrGao/p/17506444.html

相关文章

  • springboot 跨域设置
      写文章 SpringBoot项目解决跨域的几种方案小满只想睡觉一直快乐!​关注她  在用SpringBoot开发后端服务时,我们一般是提供接口给前端使用,但前端通过浏览器调我们接口时,浏览器会有个同源策略的限制,即协议,域名,端口任一不一样时都会......
  • 在VScode中,文件自动添加头部注释-插件koroFileHeader配置
    1、扩展商店,搜索koroFileHeader进行安装2、打开设置-搜索Fileheader-点击头部注释的setting.json文件3、可以在其中配置头部注释"fileheader.customMade":{"Author":"gitconfiguser.name",//作者//"Author":"gitconfiguser.name",//可以获......
  • ReentrantLock底层实现原理
    ReentrantLock底层的源码分析:本小节我们将由浅入深的讲解ReentrantLock的底层源码,其中会附带有源码的分析:1.自己实现简易的ReentrantLock锁:在多线程的并发的操作当中,我们需要通过锁机制来实现多个线程互斥的访问特定的资源从而避免并发下的操作问题。我们可以先来看一下Reentra......
  • 详解自动化面试常见算法题!!
    1、实现一个数字的反转,比如输入12345,输出54321num=12345num_str=str(num)reversed_num_str=num_str[::-1]reversed_num=int(reversed_num_str)print(reversed_num)#输出54321代码解析:首先将输入的数字转换为字符串,然后使用切片操作将字符串反转,最后再将反转......
  • 自动化神器 Playwright 的 Web 自动化测试解决方案
    1.主流框架的认识 总结:由于Selenium在3.x和4.x两个版本的迭代中并没有发生多大的变化,因此Selenium一统天下的地位可能因新框架的出现而变得不那么稳固。后续的Cypress、TestCafe、Puppeteer被誉为后Selenium时代WebUI自动化的三驾马车。但是由于这三个框架都是基于JavaScr......
  • 深度解析SpringBoot内嵌Web容器
    你好,我是刘牌!前言今天分享一个SpringBoot的内嵌Web容器,在SpringBoot还没有出现时,我们使用Java开发了Web项目,需要将其部署到Tomcat下面,需要配置很多xml文件,SpringBoot出现后,就从繁琐的xml文件中解脱出来了,SpringBoot将Web容器进行了内嵌,我们只需要将项目打成一个jar包,就可以运行......
  • 基于C#自动调整pdf注释框的方法
    众所周知pdf注释框是无法随着文字大小而自动调整宽高的,因此在网上搜索了很多文章,但并没有找到好的方法,于是打算使用程序自己写代码进行调整。准备工作要想自动调整注释框,首先得知道每个注释框的宽高,以及所属字体,是否加粗等信息。所幸这些信息在pdf导出的注释文件(.xfdf)都......
  • Postgresql自动备份
    经过一番测试验证,现将Postgresql自动备份的主要脚本和定时任务设置进行记录,以方便必要时候可借鉴使用,现初始约定如下:PG版本号=13脚本执行目录:F:\PostgreBackup\备份文件目录F:\PostgreBackup\Fullbackup一、基本操作1.脚本准备@ECHOOFF@setlocalenableex......
  • 肝了一周总结的SpringBoot常用注解大全,看完就炉火纯青了!
      来源于 https://www.macrozheng.com/mall/reference/springboot_annotation.html  肝了一周总结的SpringBoot常用注解大全,看完就炉火纯青了!   平时使用SpringBoot开发项目,少不了要使用到它的注解。这些注解让我们摆脱了繁琐的传统SpringXML配置,让我们开发项目......
  • 个包含电动四轮车控制器代码的资源,其中包括PCB文件、pdf原理图和完整的代码
    一个包含电动四轮车控制器代码的资源,其中包括PCB文件、pdf原理图和完整的代码。这些资源来自一个知名厂家,代码的编写风格非常出色。从这段话中,我们可以提取出以下知识点和领域范围:电动四轮车、控制器、PCB设计、原理图、代码编写。关于电动四轮车,它是一种使用电力驱动的车辆,通常......