当前位置: 首页 > news >正文

SpringBoot中“@SpringBootApplication“自动配置原理《第七课》

了解几个注解的概念下面的是核心注解

第一点:@SpringBootApplication介绍:

  1. 在SpringApplication类中有SpringApplication和Run方法他们的作用是什么呢!

  2. 解析注解:@SpringBootApplication 结论是

  3. 在SpringBoot学习中:@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。

  4. @EnableAutoConfiguration:能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。

  5. @ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。

  6. @Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。

第二点:public @interface SpringBootApplication 

  1. @Target({ElementType.TYPE})ElementType 提供了一个简单的分类:注释可能出现在Java程序中的语法位置(这些常量与元注释类型(@Target)一起指定在何处写入注释的合法位置)

  2. @Retention(RetentionPolicy.RUNTIME)RetentionPolicy,与元注释(@Retention)一起指定注释要保留多长时间

  3. @Documented Documented注解表明这个注释是由 javadoc记录的,在默认情况下也有类似的记录工具。 如果一个类型声明被注释了文档化,它的注释成为公共API的一部分。

  4. @Inherited @inherite 源码

  5. 然后,我们打开 inherited 的源码,可以看到:

  6. (1)该注解作用于整个程序运行中(@Retention(RetentionPolicy.RUNTIME);

  7. (2)该注解只能修饰注解(@Target({ElementType.ANNOTATION_TYPE})),因此,它是一个元注解。

  8. @SpringBootApplication:组合注解,包括以下注解。

  9. @SpringBootConfiguration  配置注解,底层其实也是@Configuration注解,只不过在SpringBoot工程中更推荐使用@SpringBootConfiguration来替代

  10. @EnableAutoConfiguration  启动自动配置,根据所依赖的Jar包自动配置相关配置项。(后续会继续解释)

  11. @ComponentScan  扫描配置,SpringBoot默认会扫描启动类所在的同级包及其子包。

@SpringBootConfiguration:springboot的配置  
  @Configuration:spring配置类      
  @Component:说明这也是spring的组件   
     @EnableAutoConfiguration::自动配置   
 @AutoConfigurationPackage:自动配置包  

    @Import(AutoConfigurationPackages.Registrar.class):自动配置‘包注册’  

  @Import(AutoConfigurationImportSelector.class):自动配置选择

@EnableAutoConfiguration 本文章以这个注解贯通自动配置原理 其他的细节下篇文章解释为了读者能看懂原理本文参用图片的方式来介绍

package com.bing.springboot0906;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Springboot0906Application {

    public static void main(String[] args) {
        SpringApplication.run(Springboot0906Application.class, args);
    }

}
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

上面的代码啥意思这里不介绍了上面有具体的说明

在上面的图片中点击EnableAutoConfiguration 后会发现上面图片代码

 

 @Import(AutoConfigurationImportSelector.class):自动配置选择  点击下面的代码 AutoConfigurationImportSelector你会发现下面类中的代码 完全是考验Java的基础的时候了。

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {}

在这个类中找到下面的图片标记的内容

上面标记的红色位置是重点哦

 

ListString> configurations = this.getCandidateConfigurations(annotationMetadata,

attributes);//获取所有的配置 点击getCandidateConfigurations会跳转到一个方法中去

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = new ArrayList(SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()));
        ImportCandidates.load(AutoConfiguration.class, this.getBeanClassLoader()).forEach(configurations::add);
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

上面的代码 获取候选配置

List<String> configurations = new ArrayList(SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(),

点击这个进去:SpringFactoriesLoader

public final class SpringFactoriesLoader {
    public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
    private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class);
    static final Map<ClassLoader, Map<String, List<String>>> cache = new ConcurrentReferenceHashMap();

    private SpringFactoriesLoader() {
    }
点击loadFactoryNames获取所有文件的配文件名称

 

找到程序出口

 

  • 结论: springboot所有 自动配置都是在启动的时候扫描并加载: spring . factories所有的自动配置类都在这里面,但是不一-定生效, 要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功!

  • springboot在启动的时候,从类路径下/META-INF/ spring . factories获取指定的值;

  • 将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动配置!

  • 以前我们需要自动配置的东西,现在springboot帮我们做了

  • 整合javaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.0.RELEASE.jar这个包下

  • 它会把所有需要导入的组件,以类名的方式返回,这些

  • 组件就会被添加到容器;

  • 容器中也会存在非常多的xxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件;并自动配置,@Configuration ,JavaConfig!

  • 有了自动配置类,免去了我们手动编写配置文件的工作!

  • 核心要义 继承继承在继承 封装封装在封装

  • 实现了SpringBoot自动配置

相关文章:

  • MySQL-3-多表查询和事务(结合案例学习)
  • Go语言 和 Java语言对比理解系列一:函数参数传递
  • Transformer模型学习笔记
  • 14.Vue3过渡和动画实现
  • SCS【7】单细胞转录组之轨迹分析 (Monocle 3) 聚类、分类和计数细胞
  • EMQX Cloud全托管的 MQTT 消息云服务
  • 【软考 系统架构设计师】操作系统① 操作系统概述
  • ARC113E Rvom and Rsrev
  • Windows与网络基础-26-IP地址概述
  • 模拟用户登录功能的实现以及演示SQL注入现象
  • 天龙八部科举答题问题和答案(全3/8)
  • CH342芯片应用—硬件设计指南
  • 【Android】-- 如何使用按钮和图片(点击事件、长按点击、同时展示文本和图像、ImageView)
  • 什么是文件格式的幻数
  • 【数据结构】绪论
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • AHK 中 = 和 == 等比较运算符的用法
  • angular组件开发
  • If…else
  • MD5加密原理解析及OC版原理实现
  • OSS Web直传 (文件图片)
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • yii2权限控制rbac之rule详细讲解
  • 从零开始在ubuntu上搭建node开发环境
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 规范化安全开发 KOA 手脚架
  • 面试遇到的一些题
  • 深入浏览器事件循环的本质
  • 使用 QuickBI 搭建酷炫可视化分析
  • 微信小程序实战练习(仿五洲到家微信版)
  • 源码安装memcached和php memcache扩展
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Java总结 - String - 这篇请使劲喷我
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • #100天计划# 2013年9月29日
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)http-server应用
  • (转)一些感悟
  • ***原理与防范
  • **CI中自动类加载的用法总结
  • .gitignore文件_Git:.gitignore
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net web项目 调用webService
  • .NET 解决重复提交问题
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)