springBoot的启动

news2024/11/25 8:21:53

自动配置注解的逻辑: 在启动类的基础上,导入了springboot的大量自动配置类,以至于自己不用关心配置实现过程(约定大于配置)

大量自动配置类是如何导入的?

Spring提供了一个SpringFactories功能(SPI: service provider interface ),读取固定文件META-INF/spring.factories,按照格式配置的内容会被加载,对应EnableAutConfiguration就是springboot要使用的自动配置类.

交给一个导入的Selector,通过类的全路径名称,实现配置类的加载,通过条件的判断,筛选满足的配置类.

所有的自动配置类都是springboot完成的? 不是,有第三方扩展的

mybatis-spring-boot-starter: mybatis-spring-boot-autoconfigure

dubbo-spring-boot-starter: dubbo-spring-boot-autoconfigure

knife4j-spring-boot-starter:knife4j-spring-boot-autoconfigure

所有的自动配置类都需要加载? 不是,加载不加载取决于条件注解是否满足

@ConditionalOnClass

@ConditionalOnMissingClass

@ConditionalOnBean

@ConditionalOnMissingBean

@ConditionalOnProperty 注解属性

prefix 前缀

name/value 属性名

havingValue 是否有值并且相等

matchIfMissing 如果没有这个属性,是否匹配(如果matchIfMissing 值为true,则表示没有)

spring.factories作用:

————————————————

在Spring Boot启动时,它会扫描classpath下所有的spring.factories文件,加载其中的自动配置类,并将它们注入到Spring ApplicationContext中,使得项目能够自动运行。该文件的格式为键值对,键是自动配置类的全限定名,值是该自动配置类所对应的配置类的全限定名。

一、主要的注解:

@SpringBootApplication是springBoot最核心的一个组合注解 ,  其组合了如下注解:
  • SpringApplicationConfiguration: 包装了一个@Configuration的注解,所以有这个注解的类本身就是一个配置类(启动类是个配置).

  • ComponentScan: 扫描 自定义的各种注解所在的包,比如service controller 全局异常捕获(加载和扫描我们自己的业务逻辑).

  • EnableAutoConfiguration: 开启自动配置加载(自动加载配置文件)

二、启动步骤:

2.1.导入选择器:

  • @SpringBootApplication注解上标注的@EnableAutoConfiguration用Import导入了一个选择器类AutoConfigurationImportSelector
    

@Import(AutoConfigurationImportSelector.class)

2.2.执行selectImports方法:

执行选择器的selectImports方法

	@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		AutoConfigurationEntry autoConfigurationEntry = 
                getAutoConfigurationEntry(annotationMetadata);
		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
	}

方法返回结果是一个数组String[] ,元素是自动配置类全路径名称.

然后就会导入这些配置类(只导入符合条件的配置类<会用@Condition注解设置条件>)(这些配置类叫做自动配置类)。

问题:如此多的配置类,不可能在一个项目中全部使用.

要进行过滤和筛选,哪些有效,哪些无效.

3.4.3 条件注解@Conditional选择

在众多的自动配置类中,就需要满足一定条件,才加载此配置类.(不满足条件,配置类不加载的.)

这个功能是spring提供的条件注解,在springboot做了衍生.

一个springboot工程启动,如果观察哪些配置满足条件,可以使用debug模式,对应root范围.

 

会在日志中出现提示:  matched configuration或unmatched configuration, 提示哪些条件没有满足.

下边是一些衍生注解:

  • @ConditionalOnClass: 标注在类上的注解和标注在方法上的注解,标注在类上 条件满足(内存中有满足条件的类)类加载, 标注在方法上条件满足方法加载.不满足,则不加载.

指定class必须在依赖环境中存在.存在则满足,不存在则不满足

  • @ConditionalOnMissingClass:与上面的条件逻辑是相反的.存在则不满足,不存在则满足

  • @ConditionalOnBean:类注解和方法注解, 某个限定条件的bean对象在容器中存在 则满足,不存在则不满足

  • @ConditionalOnMissingBean:与上面条件逻辑相反.一般是留给自定义扩展的

  • @ConditionalOnProperty:标注在类上的注解和标注在方法上的注解,标注在类上 条件满足(内存中有满足条件的属性<变量>)就加载此配置类,否则不加载

注意: 这些条件注解可以添加在配置类上也可以加在方法上(条件满足执行方法)

测试案例: 底下是一个用来测试@ConditionalOnProperty和@ConditionalOnMissingClass的案例

1.配置了@ConditionalOnProperty的配置类:

package cn.zyq.stater.config2;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;

@Configuration
//ConditionalOnProperty 描述:  test4.username=root
//  属性有test4.password=root 的属性数据 条件则满足,没有,或者值不是123456都不满足
//- 使用入口配置类扫描这个测试
//matchIfMissing表示如果条件不满足要不要执行(如果matchIfMissing = true表示test4.password=root 不存在也表示Condition满足)
@ConditionalOnProperty(prefix = "test4", value = "password" ,havingValue = "root" ,matchIfMissing = true)
public class Config6_OnCondition {
    public Config6_OnCondition(){
        System.out.println("条件配置类Config6_OnCondition ,条件满足, 加载此类");
    }
}

2.扫描此配置类的Config6_OnCondition2:

package cn.zyq.stater.config2;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@ComponentScan(basePackages= {"cn.zyq.stater.config2"})//扫描Config6_OnCondition并创建此配置类的对象
@PropertySource(value = "classpath:jdbc.properties",ignoreResourceNotFound = false)
public class Config6_OnCondition2 {

}

3. jdbc.properties:

test4.username=root
test4.password=root

4.测试类:

package cn.zyq.stater;

import cn.zyq.stater.config2.Config6_OnCondition2;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test6 {

    @Test
    public void test6(){
        AnnotationConfigApplicationContext ac3=new AnnotationConfigApplicationContext(Config6_OnCondition2.class);
    }

}

3.4.4.导入的众多配置类位置:

通过selector导入String[]数组中的配置类, 在哪里? (springboot如果将其写死.没有扩展的空间了).

springboot提供了自动配置的导入逻辑,需要准备一个META-INF/spring.factories的文件,这个文件的格式,可以参考spring-boot-autoconfigure中的内容.

 

加载自动配置的逻辑全部介绍完了.

总结:

  1. 启动类的核心注解(EnableAutoConfiguration)

  2. 叫Enable的注解都在导入

  3. Import注解导入一个selector选择器(返回一堆配置类的全路径名称String[])  读取META-INF/spring.factories的文件中的key和value

@Import(AutoConfigurationImportSelector.class)

     注意: 并不是所有String[]中的自动配置类都加载,需要满足条件注解

  

三、自动配置案例:

3.1.META-INF/spring.factories 

对应代码:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.zyq.stater.config3.autoconfig.ZyqAutoConfigure

 3.2.自动配置类:

对应代码:

package cn.zyq.stater.config3.autoconfig;

import cn.zyq.stater.bean.User1;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration//本类作为配置类,并且在spring.factories中进行配置了,如果本项目作为jar引入到其他项目中了
//即使不启动本项目, 引入本jar的项目启动时会根据spring.factories加载本配置类.然后根据 @ConditionalOnProperty判断是否会执行createUser1方法
@PropertySource(value = "jdbc.properties", ignoreResourceNotFound=false)
@Slf4j
public class ZyqAutoConfigure {

    //本类ZyqAutoConfigure作为配置类是肯定会被加载到内存的,但本方法createUser1()在加载时是否会执行要看@ConditionalOnProperty条件是否成立
    @Bean
    //首先要加载了本配置类,  然后还要条件满足,  就会创建Bean对象(User1类型),(条件不满足,user对象不创建<需要用到jdbc.properties中的配置信息>)
    @ConditionalOnProperty(prefix = "zyq", value = "enable", havingValue = "true" , matchIfMissing = false)
    public User1 createUser1(){
        log.info("条件满足1,createUser1()创建User1对象");
        System.err.println("条件满足2,createUser1()创建User1对象");
        return  new User1();
    }

}

 项目主启动类运行时就会自动加载spring.factories , 然后就会加载ZyqAutoConfigure配置类,然后会根据条件执行createUser1()方法。

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

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

相关文章

keepalived双机热备,keepalived+lvs(DR)

本节主要学习了keepalivedlvs的作用和配置方法主要配置调度器和web节点&#xff0c;还有keepalived的双击热备&#xff0c;主要内容有概述&#xff0c;安装&#xff0c;功能模块&#xff0c;配置双击热备&#xff0c;验证方法&#xff0c;双击热备的脑裂现象和VIP无法通信。 目…

❤ windows 安装后台java开发环境JDK 、MySQL 、Redis

❤ windows 安装后台java开发环境 1、windows 安装 JDK. 下载地址&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 1、下载安装 官网点击下载安装 网盘 jdk安装包 链接&#xff1a;https://pan.baidu.com/s/1sdxA6B…

Axure设计之日期选择器(年月选择)

在系统中&#xff0c;日期选择器经常会用到&#xff0c;包括日历日期的选择、日期时间的选择和日期范围的选择&#xff0c;一般是下拉列表的形式进行选择。Axure没有自带的日期选择器&#xff0c;下面教大家如何在Axure中制作真实日期选择&#xff08;年月选择&#xff09;效果…

首席执行官Adam Selipsky解读“亚马逊云科技的技术产品差异化”

迄今为止&#xff0c;亚马逊云科技已经参与了21世纪几乎所有的大型计算变革&#xff0c;亚马逊云科技是一个很传奇的故事&#xff0c;它始于大约20年前的一项实验&#xff0c;当时亚马逊试图出售其过剩的服务器。人们确实对此表示怀疑。为什么在线书店试图销售云服务&#xff1…

js逆向实战之某书protobuf反序列化

什么是Protobuf&#xff1f; \qquad Protobuf&#xff08;Protocol Buffer&#xff09;是 Google 开发的一套数据存储传输协议&#xff0c;作用就是将数据进行序列化后再传输&#xff0c;Protobuf 编码是二进制的&#xff0c;它不是可读的&#xff0c;也不容易手动修改&#xf…

抓包工具Charles的安装及代理设置(Windows浏览器代理、安卓代理)

1、下载Charles 官网地址&#xff1a;https://www.charlesproxy.com/download/&#xff0c;下载对应的安装包。安装完成后按照以下步骤进行代理配置。 2、配置Charles证书 按照以下截图步骤进行配置即可。 3、Charles代理设置 这里的端口号根据自己情况设置&#xff0c;这里…

17.4 【Linux】systemctl 针对 timer 的配置文件

有时候&#xff0c;某些服务你想要定期执行&#xff0c;或者是开机后执行&#xff0c;或者是什么服务启动多久后执行等等的。在过去&#xff0c;我们大概都是使用 crond 这个服务来定期处理&#xff0c; 不过&#xff0c;既然现在有一直常驻在内存当中的 systemd 这个好用的东西…

visio三维格式、三维旋转导出图模糊解决方案

问题描述 visio中元素经过三维格式或三维旋转&#xff08;也可能包括其他的特殊操作&#xff09;后&#xff0c;导出.emf格式的图会模糊&#xff0c;如下图所示。 解决方案 借助其他软件 在ppt中将对应的元素旋转后再导入visio&#xff0c;此时对于visio来说该元素相当于一…

RunnerGo:一款高效且易用的性能测试工具

在软件开发过程中&#xff0c;性能测试是确保应用程序能够高效运行的关键步骤。为了提供高质量的测试服务&#xff0c;许多企业正在寻求功能强大且易用的性能测试工具。RunnerGo是一个基于Go语言开发的性能测试平台&#xff0c;具有简单易用、高效稳定等特性&#xff0c;适用于…

Dubbo重启服务提供者或先启动服务消费者后启动服务提供者,消费者有时候会出现找不到服务的问题及解决

文章目录 [toc] 1.环境2.版本3.pom依赖3.1父工程的pom3.2子模块的pom 4.问题5.根本原因5.1根本原因说明5.2总入口5.3servletWeb容器初始化5.4 nacos服务注册监听点5.5 dubbo启动服务注册监听点 6.解决办法6.1降低springBoot版本为2.2.x6.2 修改源码6.2.1修改源码方式一6.2.2修改…

【RPC框架】RPC与Dubbo(让你一文搞懂,超级详细好理解!)

目录 什么是RPC框架&#xff0c;Dubbo又是什么&#xff0c;二者之间有什么联系 是不是说的有些抽象&#xff0c;那我们来说的通俗易懂点吧&#xff0c;这次你一定能听懂 简单举例 实际例子 真实场景demo&#xff08;说了这么多&#xff0c;实际体会一下代码吧&…

(6)(6.3) 自动任务中的相机控制

文章目录 前言 6.3.1 概述 6.3.2 自动任务类型 6.3.3 创建合成图像 前言 本文介绍 ArduPilot 的相机和云台命令&#xff0c;并说明如何在 Mission Planner 中使用这些命令来定义相机勘测任务。这些说明假定已经连接并配置了相机触发器和云台(camera trigger and gimbal ha…

iis服务web页面 localhost可以访问 ip不能访问

1、修改C:\Windows\System32\drivers\etc\下面hosts文件&#xff1b;需要重启电脑查看效果&#xff1b; 2、通过internet选项-》安全-》站点-》添加对应http://127.0.0.1和对应电能IP&#xff1b;

Android SDK 上手指南||第六章 用户交互

第六章 用户交互 在这篇教程中&#xff0c;我们将对之前所添加的Button元素进行设置以实现对用户点击的检测与响应。为了达成这一目标&#xff0c;我们需要在应用程序的主 Activity类中略微涉及Java编程内容。如果大家在Java开发方面的经验不太丰富也没必要担心&#xff0c;只…

Module not found: Error: Can‘t resolve ‘vue-pdf‘ in ‘xxx‘

使用命令npm run serve时vue项目报错&#xff1a; Module not found: Error: Cant resolve vue-pdf in xxx 解决方案&#xff1a; 运行命令&#xff1a; npm install vue-pdf --save --legacy-peer-deps 即可解决。 再次顺利执行npm run serve

032 - 位值类型-BIT

数据BIT类型用于存储位值。一种类型 允许存储-位值。 范围从 1 到 64。 BIT(M)MM 为了指定位值&#xff0c; 可以使用符号。是使用零和一编写的二进制值。例如&#xff0c; 和 分别代表7和128。请参见 第 9.1.5 节“位值文字”。 bvaluevalueb111b10000000 如果将值分配给 长…

ChatGPT提示与技巧分享:如何作出更好的提示2023年8月

​对ChatGPT的一些酷炫技巧感兴趣吗?这里提供了一些可以帮助你充分利用ChatGPT&#xff0c;成为AI工具专家的技巧。 毫无疑问&#xff0c;ChatGPT是目前最广泛使用的人工智能工具之一。它不仅毫不留情地取代了一些特定领域常用的软件小工具&#xff08;如智能对联、经典语录生…

2023.8 - java - Java 异常处理

异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的。 比如说&#xff0c;你的代码少了一个分号&#xff0c;那么运行出来结果是提示是错误 java.lang.Error&#xff1b;如果你用System.out.println(11/0)&#xff0c;那么…

2023年高教社杯数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&…

缓存穿透、缓存击穿和缓存雪崩

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱发博客的嗯哼&#xff0c;爱好Java的小菜鸟 &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;社区论坛&#xff1a;希望大家能加入社区共同进步…