Spring Boot Starter是什么?

标签: spring boot starter | 发表时间:2020-01-02 08:00 | 作者:
出处:https://www.dengshenyu.com/

在工作中我们经常能看到各种各样的springboot starter,如spring-cloud-netflix、spring-cloud-alibaba等等。这些starter究竟有什么作用呢?

在了解这些starter之前,我们需要先大概知道Spring MVC与Spring Boot的关系。在我大学刚毕业的时候,大家都还在用Spring MVC框架。这个框架当时已经是Java服务框架的事实标准,构建一个Java项目都会使用Spring MVC。但它的缺点在于,需要编写各种各样的xml文件来管理Bean,某个程度上说我们是在面向xml编程。

直到出现了Spring Boot。一夜之间,xml文件消失了,取而代之的是代码、注解和配置文件。甚至我们不需要一个外部的运行容器,如tomcat、Jetty等等,这些运行容器都嵌入到Spring Boot框架中。我们只需要执行 SpringApplication.run(Application.class, args);,然后一切就能正常工作!

这一切少不了Spring Boot自动装配的功劳。关于自动装配,Spring Boot官方文档是这么说的:

Spring Boot auto-configuration attempts to automatically configure your Spring application based on the jar dependencies that you have added.

Spring Boot框架会根据当前运行时的jar依赖来自动生成并装配相应的Bean,文档上举了一个例子:假如HSQLDB在你的classpath下,并且你没有手动配置任何的数据库连接Bean,那么Spring Boot会自动装配一个内存的数据库。另外,自动装配还支持根据配置属性和自定义自动装配条件,功能非常强大。

好了,现在我们再回过头来看什么是starter。其实starter就是一个写好自动装配逻辑的Jar依赖,我们只要引用这个starter,那么当程序运行时的依赖库、配置属性或其他条件满足starter中定义的逻辑时,starter就会自动装配我们的运行环境。

举个例子,当我们引用 spring-cloud-alibaba-nacos-discovery这个starter时,并且增加几个服务注册发现的配置,那么我们的应用就具备了微服务的能力。当然,除此之外,你还需要一个注册中心。该starter中并不包含注册中心,它只是帮你初始化当前的微服务注册、发现、调用、客户端负载均衡环境,让你只需要一个@Autowired的注解就能使用微服务的能力。

自动装配原理

其实自动装配的原理也很简单,它是通过 @Configuration@Conditional注解来工作的。 @Configuration注解是Spring中用来声明Bean的;而 @Conditional代表了一类条件注解,表示当且仅当满足了一定条件之后,使用 @Configuration的类才真正创建并装配Bean。

但问题又来了,我们使用starter时是只引用了一个jar包,Spring Boot框架是怎么知道jar包中的自动装配逻辑呢?答案是 META-INF/spring.factories文件。Spring Boot会检查你的jar包中是否存在 META-INF/spring.factories文件,如果存在则会进一步读取其中的 EnableAutoConfiguration配置项,该配置项包含了jar包中的自动装配类,例如:

         
1
2
3
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\
com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration

如果我们的自动装配存在上下文依赖,我们还可以使用 @AutoConfigureAfter@AutoConfigureBefore来声明装配顺序。

条件注解

上面已经提到了自动装配的条件注解,也就是@Conditional注解。其中最常用的一个是@ConditionalOnMissingBean,这个条件注解可以让我们提供一个默认行为,如果不喜欢默认行为,那么可以通过自定义Bean来覆盖掉默认Bean。

下面是自动装配中可用的条件注解。

  • @ConditionalOnClass / @ConditionalOnMissingClass:根据是否存在特定类来自动装配;
  • @ConditionalOnBean / @ConditionalOnMissingBean: 根据是否存在特定Bean来自动装配;
  • @ConditionalOnProperty:根据Spring属性值来自动装配;
  • @ConditionalOnResource:根据是否存在特定资源文件来自动装配;
  • @ConditionalOnWebApplication / @ConditionalOnNotWebApplication:根据是否为’Web 应用’来自动装配,一个’Web应用’意味着使用Spring的WebApplicationContext,并且定义了session scope或者有一个StandardServletEnvironment;
  • @ConditionalOnExpression:根据SpEL表达式来自动装配;

starter包规范

Spring Boot官方文档推荐一个starter应当包含如下两个部分:

  • autoconfigure模块:实现自动装配的逻辑;
  • starter模块:集成autoconfigure模块、依赖库和其他依赖,用户只需要引用这个starter那么就可以使用。

如果分开这两个模块做成jar包比较麻烦,也可以将它们合成一个大的模块,也就是最终的starter包。

在starer包命名上,Spring Boot官方包一般会以spring-boot为前缀,而其他自定义的包则建议不能以spring-boot开头,即便使用不同的groupId。假如我们需要创建一个“acme”库的starter,那么autoconfigure模块可以命名为acme-spring-boot-autoconfigure,而starter模块可以命名为acme-spring-boot-starter;而如果你选择将这两个模块合成一个模块,那么就采取acme-spring-boot-starter就行。

另外,如果starter使用了一些配置项,那么这些配置项应当放在特定的命名空间(即前缀)下,不能放在Spring Boot配置项所在的命名空间下,如server、management、spring等等。

生成配置项元数据

对于使用了@ConfigurationProperties的配置类,我们可以通过spring-boot-configuration-processor这个jar包来生成元数据文件,生成后的文件为META-INF/spring-configuration-metadata.json。这样做的好处是,IDE里面可以显示配置的含义。

相关 [spring boot starter] 推荐:

Spring Boot Starter是什么?

- - 技术,永无止境
在工作中我们经常能看到各种各样的springboot starter,如spring-cloud-netflix、spring-cloud-alibaba等等. 这些starter究竟有什么作用呢. 在了解这些starter之前,我们需要先大概知道Spring MVC与Spring Boot的关系.

Spring Cloud版本控制和灰度starter-spring-cloud-gray

- -
Spring Cloud Gray - 微服务灰度中间件. Spring Cloud Gray 是一套开源的微服务灰度路由解决方案,它由spring-cloud-gray-client,spring-cloud-gray-client-netflix 和 spring-cloud-tray-server,spring-cloud-gray-webui组成.

Spring boot传统部署

- - 企业架构 - ITeye博客
使用spring boot很方便,一个jar包就可以启动了,因为它里面内嵌了tomcat等服务器. 但是spring boot也提供了部署到独立服务器的方法. 如果你看文档的话,从jar转换为war包很简单,pom.xml的配置修改略去不讲. 只看source的修改,很简单,只要一个配置类,继承自SpringBootServletInitializer, 并覆盖configure方法.

值得使用的Spring Boot

- - ImportNew
2013年12月12日,Spring发布了4.0版本. 这个本来只是作为Java平台上的控制反转容器的库,经过将近10年的发展已经成为了一个巨无霸产品. 不过其依靠良好的分层设计,每个功能模块都能保持较好的独立性,是Java平台不可多得的好用的开源应用程序框架. Spring的4.0版本可以说是一个重大的更新,其全面支持Java8,并且对Groovy语言也有良好的支持.

Spring Boot配置多个DataSource

- - 廖雪峰的官方网站
使用Spring Boot时,默认情况下,配置 DataSource非常容易. Spring Boot会自动为我们配置好一个 DataSource. 如果在 application.yml中指定了 spring.datasource的相关配置,Spring Boot就会使用该配置创建一个 DataSource.

Spring boot executable jar/war 原理

- - ImportNew
spring boot里其实不仅可以直接以 Java -jar demo.jar的方式启动,还可以把jar/war变为一个可以执行的脚本来启动,比如./demo.jar. 把这个executable jar/war 链接到/etc/init.d下面,还可以变为Linux下的一个service. 只要在spring boot maven plugin里配置:.

SPRING BOOT OAUTH2 + KEYCLOAK - service to service call

- - BlogJava-首页技术区
employee-service调用department-service,如果要按OAUTH2.0流程,只需要提供client-id和client-secrect即可. 在KEYCLOAK中引入service-account,即配置该employee-service时,取消standard-flow,同时激活service-account.

spring boot与spring batch、postgres及elasticsearch整合

- - 互联网 - ITeye博客
当系统有大量数据需要从数据库导入elasticsearch时,使用sping batch可以提高导入的效率. 这篇文章使用spring batch将数据从postgres导入elasticsearch. 本文使用spring data jest连接ES(也可以使用spring data elasticsearch连接ES),ES版本为5.5.3.

Spring Boot使用redis做数据缓存

- - ITeye博客
SysUser.class)); //请注意这里. 3 redis服务器配置. /** *此处的dao操作使用的是spring data jpa,使用@Cacheable可以在任意方法上,*比如@Service或者@Controller的方法上 */ public interface SysUserRepo1 extends CustomRepository {.

spring boot应用启动原理分析

- - ImportNew
在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个Web Server. 如果之前没有使用过spring boot可以通过下面的demo来感受下. 下面以这个工程为例,演示如何启动Spring boot项目:.