01SpringBoot

Spring Boot比Spring做了哪些改进?

1)Spring Boot可以建立独立的Spring应用程序;
2)内嵌了如Tomcat,Jetty和Undertow这样的容器,也就是说可以直接跑起来,用不着再做 部署工作了;
3)无需再像Spring那样搞一堆繁琐的xml文件的配置;
4)可以自动配置Spring。SpringBoot将原有的XML配置改为Java配置,将bean注入改为使 用注解注入的方式(@Autowire),并将多个xml、properties配置浓缩在一个appliaction.yml 配置文件中。
5)提供了一些现有的功能,如量度工具,表单数据验证以及一些外部配置这样的一些第三方功 能;
6)整合常用依赖(开发库,例如spring-webmvc、jackson-json、validation-api和tomcat 等),提供的POM可以简化Maven的配置。当我们引入核心依赖时,SpringBoot会自引入其 他依赖。

SpringBoot自动配置的原理

  • 核心目标是”约定优于配置”
  • @SpringBootApplication注解下
    • @SpringBootConfiguration:我们点进去以后可以发现底层是Configuration注解,说白了就是支持JavaConfig的方式来进行配置(使用Configuration配置类等同于XML文件)。
    • @EnableAutoConfiguration:开启自动配置功能(后文详解)
    • @ComponentScan:这个注解,学过Spring的同学应该对它不会陌生,就是扫描注解,默认是扫描当前类下的package。将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中。

@SpringBootConfiguration

@ComponentScan

@EnableAutoConfiguration

  • @AutoConfigurationPackage:自动配置包
  • @Import(AutoConfigurationImportSelector.class):给IOC容器导入组件

@AutoConfigurationPackage

  • 我们可以发现,依靠的还是@Import注解,再点进去查看,我们发现重要的就是以下的代码:
  • @Import(AutoConfigurationPackages.Registrar.class)
  • @Override
    public void registerBeanDefinitions(AnnotationMetadata metadata,
            BeanDefinitionRegistry registry) {
        register(registry, new PackageImport(metadata).getPackageName());
    }
    
  • 默认的情况下就是将:主配置类(@SpringBootApplication)的所在包及其子包里边的组件扫描到Spring容器中。
  • 与ComponentScan的区别是:扫描的对象是不一样,比如说,你用了Spring Data JPA,可能会在实体类上写@Entity注解。这个@Entity注解由@AutoConfigurationPackage扫描并加载,而我们平时开发用的@Controller/@Service/@Component/@Repository这些注解是由ComponentScan来扫描并加载的。

@Import(AutoConfigurationImportSelector.class)

  • SpringBoot注解实现

  • FACTORIES_RESOURCE_LOCATION的值是META-INF/spring.factories

  • Spring启动的时候会扫描所有jar路径下的META-INF/spring.factories,将其文件包装成Properties对象

  • 从Properties对象获取到key值为EnableAutoConfiguration的数据,然后添加到容器里边。

总结

  • 其中@EnableAutoConfiguration是关键(启用自动配置),内部实际上就去加载META-INF/spring.factories文件的信息,然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置功能!

01SpringBoot
https://x-leonidas.github.io/2022/02/01/11技术栈/spring/01SpringBoot/
作者
听风
发布于
2022年2月1日
更新于
2025年6月12日
许可协议