springboot自定义starter

1.springboot自动装配原理 

 

 

@SpringBootApplication中@EnableAutoConfiguration的注解会扫描maven包中的META-INF/spring.factories文件

2.自定义starter

启动器的核心其实就是自动配置类,在自动配置源码分析的章节已经介绍过,AutoConfigurationImportSelector是从spring.factories中加载自动配置类,因此只需要将自定义的自动配置类设置在该文件中即可。 

读过源码的朋友都知道自动配置类常用的一些注解,总结如下:

  • @Configuration: 该注解标志这是一个配置类,「自动配置类可以不加该注解」。
  • @EnableConfigurationProperties:这个配置也是经常使用了,使得指定的属性配置生效。一般自动配置类都需要从全局属性配置中读取自定义的配置,这就是一个开关。
  • @ConditionalOnXxxx:该注解是自动配置类的核心了,自动配置类既要启动时自动配置,又要保证用户用户自定义的配置覆盖掉自动配置,该注解就是一个条件语句,只有当指定条件成立才会执行某操作。不理解的,请看作者前面的一篇文章:这类注解都不知道,还说用过Spring Boot~
  • @AutoConfigureAfter:指定自动配置类的执行先后顺序,下文详细介绍。
  • @AutoConfigureBefore:指定自动配置列的执行先后顺序,下文详细介绍。
  • @AutoConfigureOrder:指定自动配置类的优先级,下文详细介绍。

1.准备自己的自动配置类 

启动器的灵魂核心就是自动配置类,因此需要首先创建一个自动配置类,如下:

@Configuration
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE+5)
@ConditionalOnProperty(prefix = "my.auto",name = "enabled",havingValue = "true",matchIfMissing = true)
public class MyCustomAutoConfiguration {
 
}

2. 将自动配置类设置在spring.factories

标注了@Configuration注解的自动配置类如果不放在spring.factories文件中,仅仅是一个普通的配置类而已。想要其成为自动配置类,需要在spring.factories文件中设置,如下:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MyCustomAutoConfiguration

经过以上的配置,粗略的启动器完成了,只需要打包,然后Maven引入即可工作。

3.如何指定自动配置类的执行顺序

自动配置类需要定义执行顺序吗?答案:肯定的。比如Mybatis的自动配置类,肯定要在数据源的自动配置类之后执行,否则如何创建SqlSessionFactory?

如何自定义自动配置类的执行顺序呢?此时就需要用到上文提到的三个注解,如下:

  • @AutoConfigureAfter: 当前配置类在指定配置类之后执行
  • @AutoConfigureBefore: 当前配置类在指定配置类之前执行
  • @AutoConfigureOrder:指定优先级,数值越小,优先级越高。
     

4.源码分析自动配置类如何排序?

其实关键的代码还是在AutoConfigurationImportSelector中,将自动配置类从spring.factories加载出来之后会根据条件排序,在selectImports()方法中最后一行代码如下:

return sortAutoConfigurations(processedConfigurations, getAutoConfigurationMetadata()).stream()
     .map((importClassName) -> new Entry(this.entries.get(importClassName), importClassName))
     .collect(Collectors.toList());

上面的代码则是将排序好的自动配置类返回,跟进代码,发现最终的实现都在AutoConfigurationSorter.getInPriorityOrder()方法中,逻辑如下图:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值