Spring Boot starter

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2016/02/22/spring-boot-starter/

Spring Boot推出后取得了巨大的成功,方便快速上手,还附带了很多product-ready特性。对微服务架构也很友好。

随着Spring Boot一起推出的还有Spring Boot众多的starter。当你喜欢使用某些组件时,试试starter,只需要使用构建工具引用一个依赖,你就可以快速获得它。

了解starter之后你也可以自己实现自己的starter,以便其他同事快速使用公司内部特有的组件。

spring.factories

每个starter都有一个spring.factories文件,位于META-INF目录下。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\

随便开一个文件来看

@Configuration
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.class)
public class RabbitAutoConfiguration {

	@Bean
	@ConditionalOnProperty(prefix = "spring.rabbitmq", name = "dynamic", matchIfMissing = true)
	@ConditionalOnMissingBean(AmqpAdmin.class)
	public AmqpAdmin amqpAdmin(ConnectionFactory connectionFactory) {
		return new RabbitAdmin(connectionFactory);
	}

可以看到很多@ConditionalOnXXX的注解,这就是关键的地方。

条件注解

在引入starter后可能会提供一些暴露给上下文的bean,但是有时候又是不需要的,比如用户自己提供了对应的bean,或者用户通过配置关闭了部分功能。

主要的条件有这几种

  • OnBeanCondition
  • OnClassCondition
  • OnExpressionCondition
  • OnJavaCondition
  • OnJndiCondition
  • OnPropertyCondition
  • OnResourceCondition
  • OnWebApplicationCondition
  • OnMissingBean
  • OnProperty

当对应条件满足时,响应的代码才会执行。

比如starter中并没有引入对应的具体实现,那么这种情况下就不应该实例化相应的配置和实例。

比如CassandraDataAutoConfiguration,在没有Cassandra对应实现情况下就应该直接忽略

@ConditionalOnClass({ Cluster.class, CassandraAdminOperations.class })

如果用户自己配置了CassandraMappingContext,那么starter中就不应该再提供任何MappingContext配置

@Bean
	@ConditionalOnMissingBean
	public CassandraMappingContext cassandraMapping() {
		return new BasicCassandraMappingContext();
	}

ConditionalOnExpression我一直觉得是一个很有用处的配置,使用SpEL基本上能够实现所有情况判断,但是我并没有看到任何一个用这个的例子。

活用这些配置,可以轻易创造出很多灵活的starter。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2016/02/22/spring-boot-starter/

发表评论