springboot学习笔记(springboot原理初探)

springboot原理初探

      • springboot自动配置
      • SpringApplication.run分析

springboot自动配置

pom.xml

  • spring-boot-dependencies:核心依赖在父工程中!
  • 我们在写或者引入一些Springboot依赖时,不需要指定版本,就是因为有这些版本仓库

启动器

  • <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starterartifactId>
    dependency>
    
  • 启动器:说白了就是Springboot的启动场景

  • 比如:spring-boot-starter-web,他就会帮我们自动导入web环境的所有依赖

  • springboot会将所有的功能场景,都变成一个个的启动器,当我们需要使用某些功能时候,只需要找到对应的启动器即可,starter,可参考文档:https://docs.spring.io/spring-boot/docs/2.3.2.RELEASE/reference/html/using-spring-boot.html#using-boot-starter

主程序

//@SpringBootApplication是标志这个类是springboot的应用
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        //将springboot应用启动
        SpringApplication.run(DemoApplication.class, args);
    }

}

注解:组合注解

@SpringBootApplication中:

@SpringBootConfiguration:springboot的配置
	@Configuration:spring的配置类
		@Component:说明这也是个spring组件

@EnableAutoConfiguration:自动配置
	@AutoConfigurationPackage:自动配置包
		@Import({Registrar.class}):自动配置‘包注册’
			AnnotationMetadata metadata:注册元数据
		@Import({AutoConfigurationImportSelector.class}):自动配置导入选择
//获取所有的配置
 List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);

获取候选的配置

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        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;
    }

loadFactoryNames类

String factoryTypeName = factoryType.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());

loadSpringFactories类

Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
LinkedMultiValueMap result = new LinkedMultiValueMap();

所以springboot所有的自动配置都是在启动的时候扫描并加载,spring.factories所有配置类都在这里,springboot对其进行读取再遍历加载其资源

②@ConditonalOnXXX:如果这里面的条件都满足,才会生效,所以要导入相应的starter才能有作用!

③@ComponentScan

这个注解在Spring中很重要 ,它对应XML配置中的元素。

作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中

④org.springframework.boot.autoconfigure. 包下的配置项,通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中。

结论:

  1. SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
  2. 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
  3. 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
  4. 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
  5. 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;

SpringApplication.run分析

分析该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;

SpringApplication

这个类主要做了以下四件事情:

1、推断应用的类型是普通的项目还是Web项目

2、查找并加载所有可用初始化器 , 设置到initializers属性中

3、找出所有的应用程序监听器,设置到listeners属性中

4、推断并设置main方法的定义类,找到运行的主类

springboot学习笔记(springboot原理初探)_第1张图片


  1. 学习于狂神说B站视频1 ↩︎

你可能感兴趣的:(springboot学习笔记(springboot原理初探))