打造属于个人的简单spring-boot-starter组件

先上 GitHub地址,里面有例子的源码。

先说下原理:

先从springboot的启动讲起:

从main方法启动类上面的注解SpringBootApplication进去

springboot开源组件 springboot组件化开发_jar


进一步查看EnableAutoConfiguration,

springboot开源组件 springboot组件化开发_java_02


再次点击这个自动配置导入选择器,他会自动导入META-INF/spring.factories 里面的实现类加入spring的ioc容器。这里涉及到 Java 的 SPI 机制。

springboot开源组件 springboot组件化开发_spring_03


随便点开 里面有形形式式的配置类

springboot开源组件 springboot组件化开发_jar_04


那我们明白了 他会加载这个文件的类进spring的ioc容器,那我们在这里做好自动的配置的实例化不就好了吗?

代码示例:(完整示例代码在GitHub) 我这截图说明下情况

新建一个springboot项目

(记得把Main方法去掉,因为这个作为组件,不需要启动 最后是打成jar的)

添加下面两个依赖到pom.xml文件当中。

springboot开源组件 springboot组件化开发_spring boot_05


其中 spring-boot-configuration-processor 的作用是编译时生成 spring-configuration-metadata.json ,此文件主要给IDE使用。如当配置此jar相关配置属性在 application.yml ,你可以用ctlr+鼠标左键点击属性名,IDE会跳转到你配置此属性的类中。

springboot开源组件 springboot组件化开发_java_06


springboot开源组件 springboot组件化开发_springboot开源组件_07


我们日常使用的Spring官方的Starter一般采取spring-boot-starter-{name} 的命名方式,如 spring-boot-starter-web 。

springboot开源组件 springboot组件化开发_spring_08


这个也是我们要在其他地方引入的。

第二步编写我们的Service类

编写简单的接口和实现类,就是利用自动配置原理把这个service注入到spring的ioc容器中 提供给其他项目使用。。。

springboot开源组件 springboot组件化开发_spring boot_09

第三步设置读取配置文件的属性类

自行设置默认值,O(∩_∩)O哈哈~

springboot开源组件 springboot组件化开发_jar_10

第四步 也是核心的一步 靠它来把配置文件的属性和提供服务(service)的类关联起来

springboot开源组件 springboot组件化开发_spring boot_11


下面列举SpringBoot中的所有@Conditional注解及作用

@ConditionalOnBean:当容器中有指定的Bean的条件下  
@ConditionalOnClass:当类路径下有指定的类的条件下  
@ConditionalOnExpression:基于SpEL表达式作为判断条件  
@ConditionalOnJava:基于JVM版本作为判断条件  
@ConditionalOnJndi:在JNDI存在的条件下查找指定的位置  
@ConditionalOnMissingBean:当容器中没有指定Bean的情况下  
@ConditionalOnMissingClass:当类路径下没有指定的类的条件下  
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件下  
@ConditionalOnProperty:指定的属性是否有指定的值  
@ConditionalOnResource:类路径下是否有指定的资源  
@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean @ConditionalOnWebApplication:当前项目是Web项目的条件下

最后一步 在resources/META-INF/下创建spring.factories文件,让spring框架去读上面这个自动配置类,并添加如下内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.zhifa.starter.autoConfig.StarterAutoConfigure

springboot开源组件 springboot组件化开发_java_12

打包到本地maven仓库

利用编译器执行 mvn clean install

测试

再新建一个新的springboot项目:

在pom中引入:上面的maven 坐标

springboot开源组件 springboot组件化开发_spring_13


完成测试、、正是执行com.zhifa.starter.service.impl.ZhifaStarterServiceImpl#say方法O(∩_∩)O哈哈~

springboot开源组件 springboot组件化开发_spring_14