Spring Boot Starter依赖包
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包。你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包
Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。
Spring Boot Starter的设计使得应用可以通过引入不同的Starter来实现模块化的开发。每个Starter都关注—个特定的功能领域,如数据库访问、消息队列、Web开发等。
spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
spring-boot-starter-data-jpa 数据库支持
spring-boot-starter-data-redis redis数据库支持
spring-boot-starter-data-solr solr支持
mybatis-spring-boot-starter 第三方的mybatis集成starter
spring-boot-starter-activemq 集成ActiveMQ
SpringBoot 的启动流程
Spring Boot的启动流程可以概括为以下几个步骤:
1. 加载启动类
当 SpringBoot 项目启动时,会在当前工作目录下寻找有@SpringBootApplication注解标识的类,并把这个类作为应用程序的入口点。如果找不到这样的主类,则会打印错误信息并退出。
- @EnableAutoConfiguration会加载所有符合条件的@Configuration修饰的类
启动类必须使用 @SpringBootApplication 注解标记该类。在启动类的main()方法中,调用了SpringApplication.run() 方法来启动 Spring Boot 应用程序。该方法接受两个参数,第一个参数是启动类的类对象,第二个参数是主方法的参数。
2. 加载配置文件
SpringBoot会自动扫描当前项目的resources目录,并加载其中的application.properties或application.yml等配置文件。这些配置文件中包含了应用程序的各种参数,例如数据库连接信息、日志级别等等。
3. 初始化ApplicationContext
SpringBoot会创建一个SpringApplication对象,调用构造方法:资源加载器、主方法类、确定应用程序类型为Servlet、加载所有初始化类(注册初始化、上下文初始化)、加载所有监听器、确定main方法所在的类。
之后,调用其run()方法来初始化ApplicationContext。这个过程中,【环境准备】SpringBoot会读取配置文件中的参数,并将它们转换成Environment对象中的属性。(加载系统环境变量、JVM系统属性、启动参数args)同时,它还会扫描当前项目中的所有Bean,【容器创建】并将它们注册到ApplicationContext中。
【填充容器refreshContext】ApplicationContext容器创建完成之后,将自身提供的以及自定的所有Bean对象放进容器中【自动装配】包含12个小步骤:自动装配/Bean的生命周期/启动Tomcat。
4. 启动内嵌的Web服务器
SpringBoot内置Tomcat和Jetty等Web服务器,当SpringBoot应用程序启动时,它会根据配置文件中的信息自动创建Tomcat或Jetty等Web容器,并将Spring容器注册到Web容器中,使得SpringBoot应用程序可以直接以Web应用程序的形式运行。
5. 发布启动事件/启动应用程序
根据之前创建好的 Spring 容器以及Web服务器,启动相应的线程进行服务处理。
6. 监听应用程序的状态
SpringBoot会监听应用程序的状态,并根据需要进行相应的操作。例如,当应用程序退出时,它会打印出详细的日志信息,并将应用程序的上下文环境恢复到初始状态。
注:从启动类的Main方法中调用SpringApplication.run(DemoApplication.class, args)方法开始,然后在SpringApplication对象的run方法中做了一系列操作来完成项目启动所需的3. 初始化Spring容器、4. 启动内置tomcat、5. 启动应用程序以及6. 通知监听者等步骤。
SpringApplication.run()方法源码分析
SpringBoot中配置文件的加载顺序:
优先级从高到低,高优先级的配置覆盖低优先级的配置所有配置会形成互补配置。
- 命令行参数。所有的配置都可以在命令行上进行指定;
- Java系统属性(System.getProperties0))。
- 操作系统环境变量。
- jar包。外部的application-{profile}.properties或applidation.yml(带spring.profile)配置文件
- jar包。内部的application-{profile}.properties或appliction.yml(带spring.profile)配置文件再来加载不带profile。
- jar包。外部的application.properties或application.yml(不带spring.profile)配置文件。
- jar包。内部的application.properties或application.yml(不带spring.profile)配置文件。
- @Configuration注解类上的@PropertySource。
SpringBoot自动配置
@SpringBootApplication注解
@EnableAutoConfiguration里的两个重要注解
1. @AutoConfigurationPackage :自动配置包
Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器。
2. @Import({AutoConfigurationImportSelector.class}):给容器导入组件
AutoConfigurationImportSelector:自动配置导入选择器。AutoConfigurationImportSelector 是 Spring Boot 中一个重要的类,它实现了 ImportSelector 接口,用于实现自动配置的选择和导入。具体来说,它通过分析项目的类路径和条件来决定应该导入哪些自动配置类。
SpringBoot 自动装配原理
SpringBoot 通过 @EnableAutoConfiguration 注解开启自动配置,从classpath中搜寻所有的META-INF/spring.factories配置文件,加载 spring.factories 中注册的各种 AutoConfiguration 类(其中对应的org.springframework.boot.autoconfigure 包下的配置项),当某个 AutoConfiguration 类满足其注解 @Conditional 指定的生效条件 (Starters 提供的依赖、配置或 Spring 容器中是否存在某个 Bean 等)时,通过反射实例化该 AutoConfiguration 类中定义的 Bean (组件等),并注入 Spring 容器,就可以完成依赖框架的自动配置。
详细分解过程:
- 扫描类路径: 在应用程序启动时,AutoConfigurationImportSelector 会扫描类路径上的 META-INF/spring.factories 文件,这个文件中包含了各种 Spring 配置和扩展的定义。在这里,它会查找所有实现了 AutoConfiguration 接口的类,具体的实现为getCandidateConfigurations方法。selectImports()方法获取所有符合条件的类的全限定类名调用getAutoConfigurationEntry(),接着getAutoConfigurationEntry()又调用了getCandidateConfigurations(),getCandidateConfigurations()中SpringFactoriesLoader.loadFactoryNames()方法中传入参数EnableAutoConfiguration.class,loadFactoryNames方法会读取spring.factories中EnableAutoConfiguration.class类名对应的值。
- 条件判断: 对于每一个发现的自动配置类,AutoConfigurationImportSelector 会使用条件判断机制(通常是通过 @ConditionalOnXxx 注解)来确定是否满足导入条件。这些条件可以是配置属性、类是否存在、Bean是否存在等等。
- 根据条件导入自动配置类: 满足条件的自动配置类将被导入到应用程序的上下文中。这意味着它们会被实例化并应用于应用程序的配置。