SpringBoot中starter原理简介

  • Post author:
  • Post category:其他




SpringBoot中starter原理简介

在springboot项目的pom文件中会发现很多带starter的pom包,这也是springboot的一个典型特点,starter是什么?怎么用的?

开发springboot最常见的starter就是:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

引入了这个maven依赖,基本就满足了日常的web接口开发,而不使用springboot时,需要引入spring-web、spring-webmvc、spring-aop等等来支持项目开发。

实际上那些必要的依赖在spring-boot-starter-web中已经被引入了,说白了,starter可以当成是一个maven以来组,引入这个组名就引入了所有的依赖。

对于其他一些starter,比如要使用redis、jpa等等,就不仅仅是引入依赖了,还需要实现一些初始的配置,比如常使用@Configuration,这个注解就会在springboot启动时去实例化被其修饰的类,前提是springboot配置了@EnableAutoConfiguration,而springboot启动类默认的@SpringBootApplication中默认包含了该注解,所以不用再显示引入,最后需要在starter项目中META-INF/spring.factories中添加:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.xxx.Xxx

这样在springboot启动时,才能正确加载自定义starter的配置。

所以说,starter中简单来讲就是引入了一些相关依赖和一些初始化的配置。

为什么加了@Configuration注解还是要配置META-INF/spring.factories呢?因为springboot项目默认只会扫描本项目下的带@Configuration注解的类,如果自定义starter,不在本工程中,是无法加载的,所以要配置META-INF/spring.factories配置文件。

为什么配置了META-INF/spring.factories配置文件就可以加载?这里才是springboot实现starter的关键点,springboot的这种配置加载方式是一种类SPI(Service Provider Interface)的方式,SPI可以在META-INF/services配置接口扩展的实现类,springboot中原理类似,只是名称换成了spring.factories而已。



版权声明:本文为m0_67401228原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。