文章目录

  • 一、自动配置原理
    • 1、pom.xml 分析
    • 2、启动器
    • 3、主程序
  • 二、SpringApplication

一、自动配置原理

1、pom.xml 分析

pom.xml 中存放着大量的jar包依赖,我们在引入SpringBoot依赖的时候,不需要指定版本控制,因为存在这个版本仓库。

2、启动器

  • 像这样的 spring-boot-starter-web依赖 就是通过启动器加载,通过启动器帮我们自动导入web环境的所有依赖
  • 在SpringBoot中将所有的场景,变成了一个个的启动器来执行
  • 我们需要什么场景,就只需要找到对应的启动器即可

3、主程序

默认的主启动类:

package com.zyh;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;//标注了这个类是SpringBoot的应用
@SpringBootApplication
public class Spring01HelloworldApplication {public static void main(String[] args) {//启动了一个服务SpringApplication.run(Spring01HelloworldApplication.class, args);}}

点进@SpringBootApplication注解,其中三个重要的注解

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
  • @ComponentScan:扫描并加载符合条件的组件或者bean,将这个bean注入到IOC容器中
  • @SpringBootConfiguration:SpringBoot的配置注解,标注在类上,表示这个类是SpringBoot的配置类
  • @EnableAutoConfiguration:开启自动配置注解,以前需要我们手动配置的,现在SpringBoot就帮我们进行自动配置,点进这个注解继续看:
@AutoConfigurationPackage
@Import(AutoCon.class)
  • @AutoConfigurationPackage :自动配置包
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
  • @Import(AutoConfigurationImportSelector.class):给容器导入组件,自动配置导入选择器。

@Import(AutoConfigurationImportSelector.class) 的源码分析:

  1. 类中的getCandidateConfigurations()方法获取到候选的配置
//获取候选的配置
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());//getSpringFactoriesLoaderFactoryClass() 返回最开始启动导入自动配置的配置类Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "+ "are using a custom packaging, make sure that file is correct.");return configurations;
}
  1. getCandidateConfigurations()调用SpringFactoriesLoader的静态方法loadFactoryNames

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {String factoryTypeName = factoryType.getName();//调用了loadSpringFactories方法return loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}
  1. 点击查看loadSpringFactories方法
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {//返回被@EnableAutoConfiguration标注的类MultiValueMap<String, String> result = cache.get(classLoader);if (result != null) {return result;}try {Enumeration<URL> urls = (classLoader != null ?classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));//获取项目资源和系统资源result = new LinkedMultiValueMap<>();//将读取到的资源封装成propertieswhile (urls.hasMoreElements()) {URL url = urls.nextElement();UrlResource resource = new UrlResource(url);Properties properties = PropertiesLoaderUtils.loadProperties(resource);for (Map.Entry<?, ?> entry : properties.entrySet()) {String factoryTypeName = ((String) entry.getKey()).trim();for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {result.add(factoryTypeName, factoryImplementationName.trim());}}}cache.put(classLoader, result);return result;}catch (IOException ex) {throw new IllegalArgumentException("Unable to load factories from location [" +FACTORIES_RESOURCE_LOCATION + "]", ex);}
}
  1. 我们发现多次出现的文件资源:FACTORIES_RESOURCE_LOCATION,点进去查看:
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

打开这个文件:它的位置在我们项目jar包中;

自动配置的根源就在这里

SpringBoot的所有自动配置都是在启动的时候扫描并加载,所有的自动配置都在spring.factories中存放,但是只有判断条件成立,只要导入了对应的starter启动器,自动配置才会生效。
小结:

  • SpringBoot启动的时候,从类路径下/META-INF/spring.factories获取指定的值。
  • 将这些自动装配的类导入IOC容器,自动配置就会生效,以前我们需要手动进行配置的东西,在SpringBoot中它会帮我们进行自动配置。
  • 它会把所有需要导入的组件以类名的方式返回,这些组件就会被添加到容器中。

二、SpringApplication

这个类是我们在创建SpringBoot项目的时候,SpringBoot帮我们自动生成的。
它的作用是为我们开启一个服务

package com.zyh;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class HangSpringApplication {public static void main(String[] args) {SpringApplication.run(HangSpringApplication.class, args);}
}

SpringApplication的作用:

  • 推断项目是普通项目还是Web项目
  • 查找并加载所有的可用的初始化器,设置到 initializers 属性中
  • 推断出所有的程序应用监听器,设置到initializers属性中
  • 推断并设置main方法的定义类,找到运行的主类

SpringBoot学习(二)SpringBoot自动装配原理相关推荐

  1. 【SpringBoot】自动装配原理

    [SpringBoot]自动装配原理 文章目录 [SpringBoot]自动装配原理 一.pom.xml 1.spring-boot-dependencies 2.spring-boot-starte ...

  2. springboot 整合redis_springboot自动装配原理详解

    1)传统ssm整合redis的时候 需要在xml的配置文件中 进行大量的配置Bean 我们在这里使用springboot来代替ssm的整合,只是通过xml的形式来整合redis 第一步:加入配置 &l ...

  3. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

  4. SpringBoot自动装配原理浅析

    Springboot自动装配原理 SpringBoot是当下J2EE最为流行的框架,它有着轻量,快捷等特点,让程序员们可以专注在业务逻辑的编写上,而不用花太多的力气在一些环境的配置,整合组件的配置上面 ...

  5. 刨析 SpringBoot 自动装配原理,其实很简单

    J3 SpringBoot # 源码 # 自动装配 一日我在愉快得遨游时,看到有鱼友在问:SpringBoot 中引入了 Nacos 依赖为啥就可以直接使用 Nacos 中的相关功能呀! 认真思考了一 ...

  6. Alian解读SpringBoot 2.6.0 源码(十):启动流程之自动装配原理

    目录 一.背景 1.1.主类的加载 1.2.后置处理器的获取 二.配置类后处理器 2.1.获取配置类 2.2. 2.3.解析主类 2.3.1.整体解析过程 2.3.2.核心解析过程 2.3.3.延迟导 ...

  7. springboot 项目起步讲解及自动装配原理

    哈喽~大家好,这篇看看springboot 项目起步讲解及自动装配原理.

  8. 【理解springboot自动装配原理】

    理解springboot自动装配原理: 最近读了小马哥(mercyblitz)Springboot编程思想(核心篇),有了一些心得和感悟,分享给大家: 1. 官网介绍了激活自动装配的方法: * 文档提 ...

  9. 雷神SpringBoot入门和自动装配原理

    SpringBoot-helloWord! 首先让当前的工程作为Springboot的子工程 <parent><groupId>org.springframework.boot ...

  10. SpringBoot自动装配原理解析——面试可以这样会回答

    1. 前言 SpringBoot是目前软件中最主流的框架,无论是工作还是面试基本都有它的身影,SpringBoot主要解决了传统spring的重量级xml配置Bean,实现了自动装配:所以,我们也常在 ...

最新文章

  1. 盘点开发中那些常用的MySQL优化
  2. 正则表达式变量名命名的规则_如何简单有效地提高代码质量?修改变量名即可...
  3. OpenGL tessmodes细分模式的实例
  4. Spring、SpringMVC和SpringBoot之间的关系
  5. dockerfile二进制mysql_Dockerfile源码分离部署LNMP(Centos7)
  6. 家用计算机配置,家用计算机怎么配置?
  7. VMwar配置静态ip
  8. Silverlight for KPI
  9. [Python Nonebot]QQ自动聊天机器人
  10. 数据库开源项目_开源项目贴纸库
  11. 美化版缤纷彩色文字广告代码文字+网站添加AD教程
  12. 一文读懂 DNS 解析的工作机制和优化挑战
  13. Python开发【十一章】:RabbitMQ队列
  14. 游戏ui设计,游戏ui设计需要学什么
  15. 【论文笔记】CVR预估之ESMM模型
  16. 2021-2026年中国数字化转型市场预测:通过应用场景践行数字化优先策略
  17. 怎么查看war包代码
  18. 汽车电子点火控制系统
  19. 537V母线电压SVPWM可以逆变除空间电压矢量的最大不失真幅值为310V
  20. 英语单词的形象联想组合记忆法

热门文章

  1. 删除none 的images报错 image has dependent child images 解决办法
  2. 基于Redis实现分布式单号,分布式ID(自定义规则生成)
  3. HTTP中的POST、GET区别
  4. poj 3616 Milking Time
  5. c#引用参数ref与输出参数out
  6. 查找整数的位置c语言,1-1 编程总结:查找整数
  7. 拓端tecdat|R语言CRAN软件包Meta分析
  8. manjaroLinux安装卸载oh-my-zsh
  9. 搜索树判断 (25 分)(先序建立二叉树)
  10. mysql职业要求_运维职业要求