SpringBoot Stater原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot Stater原理相关的知识,希望对你有一定的参考价值。

参考技术A 一.SpringBoot的好处

    1.依赖管理:可插拔式的组件管理,当需要某个组件时,只需要引入相关stater即可,不需要再手动引入各个jar包,避免了包遗漏、包冲突等不必要的问题。开发人员可以专注于业务开发,

    2.自动配置:遵从"约定优于配置"的原则,开发人员可以在少量配置或者不配置的情况下,使用某组件。

    大大降低项目搭建及组件引入的成本,开发人员可以专注于业务开发,避免繁杂的配置和大量的jar包管理。

二.实现原理

    要引入某组件,无非要做两件事。一是引入jar包即pom文件引入stater;二就是编写配置文件,使用Java配置的情况下就是编写一系列@Configuration注解标注的类。那么SpringBoot是怎么来引入这些配置类的呢?就需要我们深入SpringBoot启动类一探究竟。

    SpringBoot启动类上面会有@SpringBootApplication注解,这是SpringBoot中最重要的一个注解,是实现自动配置的关键。@SpringBootApplication是一个租合注解,主要由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三部分组成。

    @SpringBootConfiguration表明该类是一个配置类。

    @EnableAutoConfiguration由@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)组成。@AutoConfigurationPackage由@Import(AutoconfigurationPackages.Registrar.class)组成,向Bean容器中注册一个AutoConfigurationPackages类,该类持有basePackage,目前我发现的作用是在MyBatis扫描注册Mapper时作为包扫描路径。

    @AutoConfigurationPackage的执行流程如下图:

    @Import(AutoConfigurationImportSelector.class)是启动自动配置的核心。这里还有一个小插曲,一直在看AutoConfigurationImportSelector的selectImports方法,却发现没有被调用,以为是demo项目问题,去真实项目中debug断点,发现也没有进入,瞬间懵逼。。。继续跟踪发现执行流程如下:

玩转 Spring Boot 原理篇(自动装配前凑之自定义Stater)

的 pom 文件中可以看出,mybatis-spring-boot-starter 包会自动引入 mybatis-spring-boot-autoconfigure 以及 mybatis 相关依赖包。

SqlSessionFactory Exception logger.debug( encoding= xmlns:xsi= xsi:schemaLocation= <modelVersion> <groupId>org.example</groupId> <artifactId>game-spring-boot-starter</artifactId> <version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version> </parent> <properties> <maven.compiler.source> <maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies>* 猜数游戏Service**/ String number) gen = ( gen == number ? gen + : + gen + * 配置类**/ @ public GameService gameService() @ private GameService gameService; @ public String say(@RequestParam(name = com.example.demo_jpa;org.springframework.boot.SpringApplication;org.springframework.boot.autoconfigure.SpringBootApplication; SpringApplication.run(GameApplication.class, args);


4. 玩一玩


运行GameApplication,浏览器访问 http://localhost:8080/guess?number=300,效果如下


至此,自定义 Spring Boot 启动依赖就完成了,其主要是 GameAutoConfiguration 配置类的立下的功劳。

5. 例行回顾

本文主要是一起探讨如何完成 Spring Boot 自定义 Starter,从代码层面先感受一下 Spring Boot 自动装配的能力。


Spring Boot 如何实现自动装配的呢?通过本次自定义 Stater,脑海中有一些大胆的猜测,猜测跟 XxxAutoConfiguration 以及 spring.factories 文件有点关系,也大胆的构思的一张图,留了一些空白,相信通过后续的源码解读,会把空白填上。

另外,本篇是 Spring Boot 自动装配的前凑篇,至于是如何实现的呢?下次将顺着主线往下捋,感兴趣的可以顺着我画的这个流程图先自己体会体会自动装配的思想。

一起聊技术、谈业务、喷架构,少走弯路,不踩大坑,会持续输出更多精彩分享,欢迎关注,敬请期待!

以上是关于SpringBoot Stater原理的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot基本使用及 stater机制原理

【原创】Springboot Redis配置总结( 基于spring-boot-data-redis-stater )

创建swagger的springboot-stater,并在spring cloud zuul网关中引入

玩转 Spring Boot 原理篇(自动装配前凑之自定义Stater)

SpringBoot源码分析----SpringBoot自动配置

SpringBoot Web项目依赖分析