Spring-Boot-Starter原理详解-b-b (springernature)
SpringBoot Starter 是一种包含了一组特定功能和依赖关系的依赖项,旨在为特定的应用程序场景提供快速集成和开箱即用的功能。主要用于将常用的功能模块打包成一个可重用的依赖项,开发者只需引入相应的Starter,即可自动配置和启用相关功能,无需手动配置或使用复杂的 XML 文件。
Starter 命名规则
SpringBoot Starter 命名规则是
spring-boot-starter-{name}
,其中
{name}
表示具体的功能模块,如
spring-boot-starter-web
表示 Web 开发相关的 Starter。命名规则使得开发者可以根据功能名称快速找到对应的 Starter,并进行引入和使用。
Starter 的原理
Starter 的核心原理是自动配置和条件化装配。SpringBoot 根据 classpath 上的资源和配置来自动配置应用程序的特定功能模块,而 Starter 中的
spring.factories
文件则是自动配置的入口。在
spring.factories
文件中,通过声明
org.springframework.boot.autoconfigure.EnableAutoConfiguration
类型的类来启用自动配置。自动配置类通过
@Conditional
注解来判断是否满足特定条件,如果满足条件,则会自动配置相应的功能模块。
通过 Maven 或 Gradle 等构建工具引入 Starter 时,它们会自动将 Starter 中的依赖项引入到项目的 classpath 中。
自定义 Starter
开发者也可以自定义自己的 Starter,使其适应特定的应用程序需求。自定义 Starter 的核心是创建一个包含自动配置类和依赖项的 Maven 或 Gradle 项目。在自动配置类中,通过
@Conditional
、
@Configuration
和
@Bean
注解等,实现自定义功能模块的自动配置。在项目构建中引入自定义 Starter 的依赖后,就可以在应用程序中直接使用自定义功能模块,无需手动配置。
总结
SpringBoot Starter 的原理基于自动配置和条件化装配,通过引入相应的 Starter,开发者可以快速集成和使用特定的功能模块,减少了手动配置和依赖管理的工作量,提高了开发效率。同时,开发者也可以根据自己的需求自定义 Starter,实现自动配置和功能模块的重用。
SpringBoot启动原理分析
自动配置核心类SpringFactoriesLoader 上面在说@EnableAutoConfiguration的时候有说META-INF下的文件,那么这个文件是怎么被spring加载到的呢,其实就是SpringFactoriesLoader类。 SpringFactoriesLoader是一个供Spring内部使用的通用工厂装载器,SpringFactoriesLoader里有两个方法, 在这个SpringBoot应用启动过程中,SpringFactoriesLoader做了以下几件事: 加载所有META-INF/中的Initializer 加载所有META-INF/中的Listener 加载EnvironmentPostProcessor(允许在Spring应用构建之前定制环境配置) 接下来加载Properties和YAML的PropertySourceLoader(针对SpringBoot的两种配置文件的加载器) 各种异常情况的FailureAnalyzer(异常解释器) 加载SpringBoot内部实现的各种AutoConfiguration 模板引擎TemplateAvailabilityProvider(如Freemarker、Thymeleaf、Jsp、Velocity等) 总得来说,SpringFactoriesLoader和@EnableAutoConfiguration配合起来,整体功能就是查找文件,加载自动配置类。 整体启动流程 在我们执行入口类的main方法之后,运行,后面new了一个SpringApplication对象,然后执行它的run方法。 初始化SpringApplication类 创建一个SpringApplication对象时,会调用它自己的initialize方法 执行核心run方法 初始化initialize方法执行完之后,会调用run方法,开始启动SpringBoot。 首先遍历执行所有通过SpringFactoriesLoader,在当前classpath下的META-INF/中查找所有可用的SpringApplicationRunListeners并实例化。 调用它们的starting()方法,通知这些监听器SpringBoot应用启动。 创建并配置当前SpringBoot应用将要使用的Environment,包括当前有效的PropertySource以及Profile。 遍历调用所有的SpringApplicationRunListeners的environmentPrepared()的方法,通知这些监听器SpringBoot应用的Environment已经完成初始化。 打印SpringBoot应用的banner,SpringApplication的showBanner属性为true时,如果classpath下存在文件,则打印其内容,否则打印默认banner。 根据启动时设置的applicationContextClass和在initialize方法设置的webEnvironment,创建对应的applicationContext。 创建异常解析器,用在启动中发生异常的时候进行异常处理(包括记录日志、释放资源等)。 设置SpringBoot的Environment,注册Spring Bean名称的序列化器BeanNameGenerator,并设置资源加载器ResourceLoader,通过SpringFactoriesLoader加载ApplicationContextInitializer初始化器,调用initialize方法,对创建的ApplicationContext进一步初始化。 调用所有的SpringApplicationRunListeners的contextPrepared方法,通知这些Listener当前ApplicationContext已经创建完毕。 最核心的一步,将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。 调用所有的SpringApplicationRunListener的contextLoaded方法,加载准备完毕的ApplicationContext。 调用refreshContext,注册一个关闭Spring容器的钩子ShutdownHook,当程序在停止的时候释放资源(包括:销毁Bean,关闭SpringBean的创建工厂等) 注: 钩子可以在以下几种场景中被调用: 1)程序正常退出 2)使用() 3)终端使用Ctrl+C触发的中断 4)系统关闭 5)使用Kill pid命令杀死进程 获取当前所有ApplicationRunner和CommandLineRunner接口的实现类,执行其run方法 遍历所有的SpringApplicationRunListener的finished()方法,完成SpringBoot的启动。
springboot自动配置原理
springboot自动配置原理是基于条件判断来配置Bean。
pring Boot的自动配置原理是基于Spring框架的条件化配置(Conditional Configuration)机制实现的。在Spring Boot中,自动配置类都是使用@Configuration注解标注的Java配置类,并且使用了多种条件注解来控制自动配置的条件和范围。
当指定的类在类路径中存在时,才会创建Bean或执行配置;当容器中不存在指定的Bean时,才会创建Bean或执行配置;当指定的配置属性存在时,才会创建Bean或执行配置;当应用是Web应用时,才会创建Bean或执行配置。
如果符合条件,Spring Boot就会自动创建Bean并注入到容器中,完成自动配置的过程。这样,应用就可以在不需要手动编写配置的情况下,快速地完成常见的功能配置,提高开发效率。
使用Spring Boot进行配置的注意事项
1、版本兼容性:Spring Boot的不同版本可能存在一些兼容性问题,需要注意选择相应的版本,以确保项目能够正常运行。
2、依赖管理:Spring Boot支持自动配置和依赖管理,需要注意导入的依赖是否正确,以避免出现冲突或版本不兼容等问题。
3、配置文件:Spring Boot的配置文件有多种格式,如properties、yaml、json等,需要根据项目的需要选择相应的格式,并将配置文件放置在正确的位置。
4、配置项:Spring Boot的配置项较多,需要注意配置项的正确使用和设置,如数据库连接、端口号、日志级别等。
5、自动配置:Spring Boot的自动配置能力较强,但也需要注意自动配置的正确性,如是否需要关闭自动配置、是否需要修改默认配置等。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。