SpringBoot手写starter全过程
SpringBoot手写starter
相信大家在公司做项目时经常会使用到公司自己封装的依赖,里面就包括一些starter。
可以用于制成通用方法以及框架等方便维护以及后续开发。所以研究了一下如何自己去写。
先小试牛刀(在一个maven项目下快速两个创建springboot项目,一个用来写starter,一个用来测试。
至于为什么这样建是因为,写完的starter需要打包然后配置下maven私库才能跨项目使用,所以现在同一个工程里做)
首先

创建完的项目就是这样子。stater的命名是有规范的,像官方的就是把自定义名字放在最后。非官方的就是放在最前面。
先不讲springboot源码了,感兴趣的可以自己去看看。
先上代码
service
import lombok.AllArgsConstructor;
/**
* @author xxx
*/
@AllArgsConstructor //全参构造器
public class SplicingService {
private String before;
private String after;
public String Splicing(String word)
{
return before+ word + after;
}
}
config
import com.abc.splicingspringbootstater.Service.SplicingService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
/**
* @author xxx
* 自动配置类
*/
@Configuration //标注为配置类 源码中可以看到 标注这个注解的类会被加载
@ConditionalOnClass(SplicingService.class) // 该注解意思是 有“”splicingservice“”类才起作用 通俗来说就是你不注该服务类,就不会去注入下面的类
@EnableConfigurationProperties(SplicingServiceProperties.class) //开启配置文件
public class SplicingAutoConfiguration {
@Resource
private SplicingServiceProperties properties; //注入配置文件
@Bean
@ConditionalOnMissingBean() //该注解的意思是如果没有发现service的bean就执行新建一个bean
public SplicingService splicingService() {
return new SplicingService(properties.getPrefix(), properties.getSuffix());
}
}
接下来就是Properties类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author xxx
*/
@Data
@ConfigurationProperties(prefix = "splicing.service") //读yml里的该路径
public class SplicingServiceProperties {
private String prefix;
private String suffix;
}
然后最关键的配置文件 spring.factories

在resource下创建文件夹META-INF,在新建文件spring.factories
里面的内容就是 声明我们要自动配置的类(这些在源码中都可以看到)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.abc.splicingspringbootstater.config.SplicingAutoConfiguration
最后就是使用test项目来测一下,首先就是在yml里写上我们的配置
splicing:
service :
prefix : AAA
suffix : BBB写一个controller 测试
import com.abc.splicingspringbootstater.Service.SplicingService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author xxx
*/
@RestController
public class TestController {
@Resource
private SplicingService splicingService;
@RequestMapping("/test")
public String getNewChar(String word)
{
return splicingService.Splicing(word);
}
}
去网页测一下可以看到结果:

大功告成,我们在拓展一下,给这个字符串拼接加一个开关enabled true的时候拼,flase就不拼
改动starter的autoconfiguration
import com.abc.splicingspringbootstater.Service.SplicingService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
/**
* @author xxx
* 自动配置类
*/
@Configuration
@ConditionalOnClass(SplicingService.class)
@EnableConfigurationProperties(SplicingServiceProperties.class)
public class SplicingAutoConfiguration {
@Resource
private SplicingServiceProperties properties;
@Bean
@ConditionalOnProperty(name = "splicing.service.enabled", havingValue = "true") // 该注解就是基于配置属性生效,处理值为“true”
public SplicingService splicingService2() {
return new SplicingService(properties.getPrefix(), properties.getSuffix());
}
@Bean
@ConditionalOnMissingBean()
public SplicingService splicingService() {
return new SplicingService("", "");
}
}
如果说这个开关新方法你写在了最开始写下面,那么一定会报错,因为会出现两个实例。
所以要把顺序调换一下,如果yml里enabled是true这样@ConditionalOnMissingBean()就会发现有实例而不在去新建,然后改一下yml再去网页试试:
splicing:
service :
enabled : false
prefix : AAA
suffix : BBB
可以看到没有拼接。
至此我们的stater就成功了。不太理解的可以去看看源码(估计也看不懂- -),之后如果自己学的更厉害了,就可以写一些框架级别的依赖文件(安全类,拦截器啥的),在去放到私库里。共勉!
项目链接:
https://github.com/ZfPx51/mystarter
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
springboot中json对象中对Long类型和String类型相互转换
与前端联调接口时,后端一些字段设计为Long类型,这样就有可能导致前端缺失精度,这时候我们就需要将Long类型返回给前端时做数据类型转换,本文主要介绍了springboot中json对象中对Long类型和String类型相互转换,感兴趣的可以了解一下2023-11-11
解决try-catch捕获异常信息后Spring事务失效的问题
这篇文章主要介绍了解决try-catch捕获异常信息后Spring事务失效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06
Red Hat 安装JDK与IntelliJ IDEA的详细过程
YUM是基于Red Hat的Linux发行版的一个强大而用户友好的包管理工具,这篇文章主要介绍了Red Hat安装JDK与IntelliJ IDEA,需要的朋友可以参考下2023-08-08
Hibernate validator使用以及自定义校验器注解
这篇文章主要介绍了Hibernate validator使用以及自定义校验器注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-01-01
Spring Boot 各种回滚操作实战教程(自动回滚、手动回滚、部分回滚)
这篇文章主要介绍了Spring Boot 各种回滚操作实战教程(自动回滚、手动回滚、部分回滚),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-07-07


最新评论