SpringBoot学习(二)SpringBoot自动装配原理
文章目录
- 一、自动配置原理
- 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)
的源码分析:
- 类中的
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;
}
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());
}
- 点击查看
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);}
}
- 我们发现多次出现的文件资源:
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自动装配原理相关推荐
- 【SpringBoot】自动装配原理
[SpringBoot]自动装配原理 文章目录 [SpringBoot]自动装配原理 一.pom.xml 1.spring-boot-dependencies 2.spring-boot-starte ...
- springboot 整合redis_springboot自动装配原理详解
1)传统ssm整合redis的时候 需要在xml的配置文件中 进行大量的配置Bean 我们在这里使用springboot来代替ssm的整合,只是通过xml的形式来整合redis 第一步:加入配置 &l ...
- SpringBoot源码分析(二)之自动装配demo
SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...
- SpringBoot自动装配原理浅析
Springboot自动装配原理 SpringBoot是当下J2EE最为流行的框架,它有着轻量,快捷等特点,让程序员们可以专注在业务逻辑的编写上,而不用花太多的力气在一些环境的配置,整合组件的配置上面 ...
- 刨析 SpringBoot 自动装配原理,其实很简单
J3 SpringBoot # 源码 # 自动装配 一日我在愉快得遨游时,看到有鱼友在问:SpringBoot 中引入了 Nacos 依赖为啥就可以直接使用 Nacos 中的相关功能呀! 认真思考了一 ...
- Alian解读SpringBoot 2.6.0 源码(十):启动流程之自动装配原理
目录 一.背景 1.1.主类的加载 1.2.后置处理器的获取 二.配置类后处理器 2.1.获取配置类 2.2. 2.3.解析主类 2.3.1.整体解析过程 2.3.2.核心解析过程 2.3.3.延迟导 ...
- springboot 项目起步讲解及自动装配原理
哈喽~大家好,这篇看看springboot 项目起步讲解及自动装配原理.
- 【理解springboot自动装配原理】
理解springboot自动装配原理: 最近读了小马哥(mercyblitz)Springboot编程思想(核心篇),有了一些心得和感悟,分享给大家: 1. 官网介绍了激活自动装配的方法: * 文档提 ...
- 雷神SpringBoot入门和自动装配原理
SpringBoot-helloWord! 首先让当前的工程作为Springboot的子工程 <parent><groupId>org.springframework.boot ...
- SpringBoot自动装配原理解析——面试可以这样会回答
1. 前言 SpringBoot是目前软件中最主流的框架,无论是工作还是面试基本都有它的身影,SpringBoot主要解决了传统spring的重量级xml配置Bean,实现了自动装配:所以,我们也常在 ...
最新文章
- 盘点开发中那些常用的MySQL优化
- 正则表达式变量名命名的规则_如何简单有效地提高代码质量?修改变量名即可...
- OpenGL tessmodes细分模式的实例
- Spring、SpringMVC和SpringBoot之间的关系
- dockerfile二进制mysql_Dockerfile源码分离部署LNMP(Centos7)
- 家用计算机配置,家用计算机怎么配置?
- VMwar配置静态ip
- Silverlight for KPI
- [Python Nonebot]QQ自动聊天机器人
- 数据库开源项目_开源项目贴纸库
- 美化版缤纷彩色文字广告代码文字+网站添加AD教程
- 一文读懂 DNS 解析的工作机制和优化挑战
- Python开发【十一章】:RabbitMQ队列
- 游戏ui设计,游戏ui设计需要学什么
- 【论文笔记】CVR预估之ESMM模型
- 2021-2026年中国数字化转型市场预测:通过应用场景践行数字化优先策略
- 怎么查看war包代码
- 汽车电子点火控制系统
- 537V母线电压SVPWM可以逆变除空间电压矢量的最大不失真幅值为310V
- 英语单词的形象联想组合记忆法