????????昨天写了一个自定义starter的demo,晚上正好有时间,整理了一下,这里简单整理一下;
目录
1.创建一个maven 项目,项目结构如下;
2.在父项目中引入相关坐标;
3.创建mystarterdemo 子模块,代码结构如下;
?4. 这里主要代码是??MyStarterAutoConfiguration 类,这里面的 ConditionalOnBean 条件注解 可加可不加,如果加上就要在使用该启动类的地方 加上?EnableMyStarterConfiguration 注解;
5.其次就是?spring.factories 配置文件,用于配置要?注入?到 spring 容器?的配置类;
6. 再就是 spring-autoconfigure-metadata.properties 配置文件,用于排除一些不必要的配置类注入到?spring容器?中,节省对内存的占用;
7. use-mystarterdemo 模块的结构如下:
?8. 这里主要关注 一下 EnableMyStarterConfiguration 注解,是不是和Springcloud 和Dubbo 的某些注解有点像;
9.测试 在配置类中加入如下配置;
????????在查看Springboot源码时,必然要翻看一下 spring.factories 配置文件,要想知道它的作用,就需要了解一个前提知识点:SPI(Service Provider Interface),有不了解的可以查看一下JDK SPI 和 Springboot SPI的相关知识;这里直接上?自定义starter 的核心代码;
1.创建一个maven 项目,项目结构如下;
2.在父项目中引入相关坐标;
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath></relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.创建mystarterdemo 子模块,代码结构如下;
?4. 这里主要代码是??MyStarterAutoConfiguration 类,这里面的 ConditionalOnBean 条件注解 可加可不加,如果加上就要在使用该启动类的地方 加上?EnableMyStarterConfiguration 注解;
@org.springframework.context.annotation.Configuration
@ConditionalOnBean(annotation = EnableMyStarterConfiguration.class)
@EnableConfigurationProperties(MyStarterProperties.class)
public class MyStarterAutoConfiguration {
private MyStarterProperties myStarterProperties;
public MyStarterProperties getMyStarterProperties() {
return myStarterProperties;
}
public MyStarterAutoConfiguration(MyStarterProperties myStarterProperties){
this.myStarterProperties =myStarterProperties;
}
}
5.其次就是?spring.factories 配置文件,用于配置要?注入?到 spring 容器?的配置类;
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.demo.mystarter.autoconfigure.MyStarterAutoConfiguration
#com.demo.mystarter.autoconfigure.MyStarterAutoConfiguration.ConditionalOnClass=com.demo.mystarter.autoconfigure.EnableMyStarterConfiguration
7. use-mystarterdemo 模块的结构如下:
?8. 这里主要关注 一下 EnableMyStarterConfiguration 注解,是不是和Springcloud 和Dubbo 的某些注解有点像;
@EnableMyStarterConfiguration
@SpringBootApplication
@RestController
public class UserMyStarter {
@Autowired
private MyStarterAutoConfiguration myStarterAutoConfiguration;
public static void main(String[] args) {
SpringApplication.run(UserMyStarter.class, args);
}
@GetMapping("getConfig")
public String getConfig(){
MyStarterProperties myStarterProperties = myStarterAutoConfiguration.getMyStarterProperties();
return "<h1>"+myStarterProperties+"</h1>";
}
}
9.测试 在配置类中加入如下配置;
mystarter.id=10001
mystarter.name=xiaochen
测试结果:
总结:这个demo写的比较简单,但对 自定义Starter的思路表示清楚了,这里需要关注SPI相关知识,再者就是了解一下 @Import 注解 ,之前我也写过一个关注这个的博客,Springboot中@Import的使用原理_北尘-CSDN博客
但当时只写了其三种用法中的一种;感兴趣的可以看看。
最后 分享一下自定义starter 的源码:粉尘/starterDemo
|