Spring Boot自定义Starter组件开发实现配置过程
作者:奇点_97 发布时间:2022-05-31 16:07:12
自定义starter
SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进 starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启 动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。 SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器。SpringBoot提供 了针对日常企业应用研发各种场景的spring-boot-starter依赖模块。所有这些依赖模块都遵循着约定 成俗的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念。
为什么要自定义starter
在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定的 包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一 遍,麻烦至极。如果我们将这些可独立于业务代码之外的功能配置模块封装成一个个starter,复用的时 候只需要将其在pom中引用依赖即可,SpringBoot为我们完成自动装配,简直不要太爽。
自定义starter的命名规则
SpringBoot提供的starter以spring-boot-starter-xxx的方式命名的。官方建议自定义的starter使用 xxx-spring-boot-starter命名规则。以区分SpringBoot生态提供的starter。
有了以上的了解后,来创建 Maven 项目,目录结构如下:
实现方法
实现自定义starter大致分一下几步:
1.引入pom依赖
2.编写测试用例类
3.创建自动配置类
4.在resources包下增加配置文件
引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.mystylefree</groupId>
<artifactId>custom-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
</project>
这里引入了自动配置类
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
编写测试类
在使用Spring官方的Starter时通常可以在application.properties中来配置参数覆盖掉默认的值。即name的值会被配置文件中的值替换掉。
@EnableConfigurationProperties({PersonProperties.class}) //开启ConfigurationProperties注解
@ConfigurationProperties(prefix = "person")
public class PersonProperties {
private int id;
private String name="章三";
}
省略set/get方法和toString方法
创建配置类
@Configuration
//当类路径classpath下有指定当类 (SimpleBean) 的情况下进行自动配置
@ConditionalOnClass(PersonProperties.class)
public class MyAutoConfiguration {
static {
System.out.println("MyAutoConfiguration init ...");
}
@Bean
public PersonProperties personProperties(){
return new PersonProperties();
}
}
创建spring.factories文件
/META-INF/spring.factories文件放在/src/main/resources目录下
注意:META-INF是自己手动创建的目录,spring.factories也是自己手动创建的文件,在该文件中配置自己的自动配置类。
一定要按照下面的位置结构添加
文件中的内容如下
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.mystylefree.config.MyAutoConfiguration
这时配置都加好了
只需从新打下包就行
mvn clean install
我们自己设置的starter包就保存到本地的maven仓库了
接下来我们就能使用刚刚自定义的jar包实现pom依赖引用了
这是我的maven依赖地址
将这个依赖加入到新的项目中引入即可
这是我的一个新springboot项目
1.加入依赖
根据自己的名称添加
<dependency>
<groupId>cn.mystylefree</groupId>
<artifactId>custom-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2.设置application.properties
person.id=1
person.name=小米
由于设置的前缀名上person
3.添加测试用例
@SpringBootTest
class SpringBootDemoApplicationTests {
@Autowired
private PersonProperties personProperties;
@Test
void contextLoads() {
int id = personProperties.getId();
String name = personProperties.getName();
System.out.println(id+name);
}
}
这时 调试就能使用自定义的starter了
但是发现出现中文乱吗了,不慌设置一下编码格式
重新启动项目
乱码问题
发现还是乱码???
在Spring Boot项目中,有时候需要自定义一些配置,如果使用中文值并使用注解读取时就会出现乱码。
原因: Spring Boot注解读取application.properties或者application-{profile}.properties文件时默认的是ISO_8859_1编码。
解决方案:
1. 使用yml配置文件进行配置。
Spring Boot在读取yaml配置文件时使用的是UTF-8的编码方式。
2. 使用自定义配置文件如:
custom.properties配置中文属性,并使用@PropertySource(value="classpath:custom.properties", encoding="UTF-8")注解指定读取的文件和编码。代码如下:
@Data
@ConfigurationProperties(prefix = "custom.user")
@PropertySource(value="classpath:custom.properties", encoding="UTF-8")
public class UserProperties {
//@Value("${custom.user.name}")
private String name;
//@Value("${custom.user.sex}")
private String sex;
}
使用@ConfigurationProperties和@Value均可以正常读取。
3. 把中文换成对应的ASCII码。
custom.user.sex=男
换成:
custom.user.sex=\u7537
以上三种方法均可以正常读取配置文件中的中文字符。
参考文档:
Spring Boot使用@ConfigurationProperties或者@Value读取properties文件中文乱码
来源:https://blog.csdn.net/qq_29235677/article/details/125226948
猜你喜欢
- 基于jsr303 通过自定义注解实现,实现思路:存在一些瑕疵,后续补充完善。加入依赖部分版本已不默认自动引入该依赖,选择手动引入<de
- 随着目前微信越来越火,所以研究微信的人也就越来越多,这不前一段时间,我们公司就让我做一个微信公众号中问卷调查发红包功能,经过一段时间的研究,
- jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过
- 今天去某在线教育面试面试官让做的一道题,题目描述如下:给定一个不重复的无序数组arr和一个定值num查找arr中是否有两个数的和等于num有
- import java.util.concurrent.Semaphore;public class ThreeThread {
- 从现在开始,大家可以跟随着我的脚步来自定义一个属于自己的Spring框架。但是,在学习自定义Spring框架之前,我们得先来回顾一下Spri
- 前言Stream是一个来自数据源的元素队列并支持聚合操作,其中具有以下特性:Stream只负责计算,不存储任何元素,元素是特定类型的对象,形
- 介绍fastjson 1.2.0之后的版本支持JSONPath。,可以在java框架中当作json对象查询语言(OQL)来使用。常用APIp
- mybatis-plus自动配置mapper.xml与java接口映射本来没有mybatis-plus的话,这个工作是通过mybatis-s
- 前言之前有做个一个自定义报表的查询,这里使用的是一个动态的sql拼接,是前端选择了什么指标就查询什么信息!(这里的指标是多个表的字段,前端随
- 在网上拷贝的所有阿里云镜像比如:<mirror> <id>nexus-aliyun</id>
- 1, * 的概念java里的 * 是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行
- jar包就指第三方提供的开源的API,这些API不属于JDK的,需要通过导入才能使用。添加和导入的区别注意:本文里的 导入 和 添加 jar
- 前言在Windows下JAVA用到的环境变量主要有3个,JAVA_HOME、CLASSPATH、PATH,下面来详细的介绍。JAVA_HOM
- 什么是深度优先什么是深度,即向下,深度优先,即向下优先,一口气走到底,走到底发现没路再往回走。在算法实现上来讲,深度优先可以考虑是递归的代名
- 在使用struts多模块的,找到一些小技巧和经验,与大家分享一下。 关于多module的配置就不说了,只需要用不同的config
- 1、cookie是啥?随手百度了网友的说说简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机。当你在
- 一个是新浪微博,腾讯微博的分享按钮,一个是他们的绑定情况(其实就是是否授权)。点击微博分享中新浪或腾讯按钮,就进行相应的授权(若没授权),显
- 1、认识XML解析技术1.1、XML相关概念(1)DTD:XML语法规则,是XML文件的验证机制,可以通过比较XML文档和DTD文件看文档是
- 前言最近数据库大作业要连接数据库,看了很多博客文章终于连接好了,但是没有看到一篇博客是能直接连接完成的,所以在这记录一下希望能帮助大家sql