您的位置:首页 > 编程语言 > Java开发

Springboot实现基于前缀的自定义配置和自动提示功能

2019-05-11 14:34 926 查看
版权声明:阅读优秀源码,宛若一场探索未知的旅行,疑惑处惊奇,优雅处旖旎; 一切都是新奇的,千回百转与大师的心灵触碰,一场跨越时空的对话,涤荡了原有的愚昧,蜕变出更好的自己。 https://blog.csdn.net/FENGQIYUNRAN/article/details/90109348

一、实现基于前缀的自定义配置

1. 引入maven依赖

[code]<!-- @ConfigurationProperties annotation processing (metadata for IDEs) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

注:该依赖非常强大,有兴趣可下载源码查看实现方式,基于工厂模式

2.配置类

[code]
@Configuration
@ConfigurationProperties(prefix = "rocketmq.consume")
public class MqConsumeClientConfig {

private String nameServer;

private String groupName;

private String instanceName;

private String isTransaction;

private Map<String, String> topics;

private Map<String, String> tags;

}

@Configuration
@ConfigurationProperties(prefix = "rocketmq.produce")
public class MqProduceClientConfig {

private String nameServer;

private String groupName;

private String instanceName;

private String isTransaction;

private Map<String, String> topics;

private Map<String, String> tags;

@Bean(name = "mqProducer")
public DefaultRocketMqProducer defaultRocketMqProducer() {
return new DefaultRocketMqProducer();
}

@Bean(name = "producer")
public DefaultMQProducer defaultMQProducer( ) {
DefaultMQProducer producer = new DefaultMQProducer(groupName);
producer.setNamesrvAddr(nameServer);
producer.setVipChannelEnabled(false);
try {
producer.start();
} catch (MQClientException e) {
System.exit(1);
return null;
}
return producer;
}

}
[code]@Configuration 
@ConfigurationProperties(prefix = "rocketmq.produce")

配合使用,@Configuration 指明配置类;@ConfigurationProperties(prefix = "rocketmq.*") 指明前缀

3. 配置文件

[code]rocketmq:
produce:
nameServer: 127.0.0.1:9876
groupName: ProduceAccountGroupDev
instanceName: ProduceAccountInstanceDev
isTransaction: 0
topics:
key1: AccountTopicDev
key2: AnswerTopicDev
tags:
key1: AccountTag1Dev
key2: AccountTag1Dev
consume:
nameServer: 127.0.0.1:9876
groupName: ConsumeAccountGroupDev
instanceName: ConsumeAccountInstanceDev
isTransaction: 0
topics:
key1: AccountTopicDev
key2: AnswerTopicDev
tags:
key1: All
key2: All

二、实现自动提示

一般在我们开发中,属性文件会产生一个自动提示,这个自定义提示也可以把我们的配置类添加到提示中。其实这是元数据文件气的作用,

提供所有支持的配置属性的详细信息。这些文件旨在允许IDE开发人员在用户使用application.properties 或application.yml文件时提供上下文帮助和“代码完成” 。

主要的元数据文件是在编译器通过处理所有被@ConfigurationProperties注解的节点来自动生成的。

1. 元数据 spring-configuration-metadata.json

配置元数据位于jars文件中的META-INF/spring-configuration-metadata.json,它们使用一个具有”groups”或”properties”分类节点的简单JSON格式:

[code]{"groups": [
{
"name": "server",
"type": "org.springframework.boot.autoconfigure.web.ServerProperties",
"sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
}
...
],"properties": [
{
"name": "server.port",
"type": "java.lang.Integer",
"sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
},
{
"name": "server.servlet-path",
"type": "java.lang.String",
"sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
"defaultValue": "/"
}
...
]}

每个”property”是一个配置节点,用户可以使用特定的值指定它。例如,server.port和server.servlet-path可能在application.properties中如以下定义

[code]server.port=9090
server.servlet-path=/home

“groups”是高级别的节点,它们本身不指定一个值,但为properties提供一个有上下文关联的分组。例如,server.port和server.servlet-path属性是server组的一部分。

注:不需要每个”property”都有一个”group”,一些属性可以以自己的形式存在。

2. 配置元数据步骤

1) 仍然是引入同样的依赖

2) 在\resources\META-INF\下添加spring-configuration-metadata.json文件。该文件可以由idea生成。

3. 生成元数据文件

1)仍然是引入同样的依赖

2)利用idea生成spring-configuration-metadata.json文件

     在idea中, Ctrl + Alt + S 快捷键打开Settings,搜索Annotation Processors,接下来勾住Enable annonation processing保存;重新编译项目。

此时可以在编译后的文件中看到自动生成的spring-configuration-metadata.json。

进一步打开文件如下:

[code]{
"hints": [],
"groups": [
{
"sourceType": "com.feeler.interlive.config.MqConsumeClientConfig",
"name": "rocketmq.consume",
"type": "com.feeler.interlive.config.MqConsumeClientConfig"
},
{
"sourceType": "com.feeler.interlive.config.MqProduceClientConfig",
"name": "rocketmq.produce",
"type": "com.feeler.interlive.config.MqProduceClientConfig"
}
],
"properties": [
{
"sourceType": "com.feeler.interlive.config.MqConsumeClientConfig",
"name": "rocketmq.consume.group-name",
"type": "java.lang.String"
},
{
"sourceType": "com.feeler.interlive.config.MqConsumeClientConfig",
"name": "rocketmq.consume.instance-name",
"type": "java.lang.String"
},
{
"sourceType": "com.feeler.interlive.config.MqConsumeClientConfig",
"name": "rocketmq.consume.is-transaction",
"type": "java.lang.String"
},
{
"sourceType": "com.feeler.interlive.config.MqConsumeClientConfig",
"name": "rocketmq.consume.name-server",
"type": "java.lang.String"
},
{
"sourceType": "com.feeler.interlive.config.MqConsumeClientConfig",
"name": "rocketmq.consume.tags",
"type": "java.util.Map<java.lang.String,java.lang.String>"
},
{
"sourceType": "com.feeler.interlive.config.MqConsumeClientConfig",
"name": "rocketmq.consume.topics",
"type": "java.util.Map<java.lang.String,java.lang.String>"
},
{
"sourceType": "com.feeler.interlive.config.MqProduceClientConfig",
"name": "rocketmq.produce.group-name",
"type": "java.lang.String"
},
{
"sourceType": "com.feeler.interlive.config.MqProduceClientConfig",
"name": "rocketmq.produce.instance-name",
"type": "java.lang.String"
},
{
"sourceType": "com.feeler.interlive.config.MqProduceClientConfig",
"name": "rocketmq.produce.is-transaction",
"type": "java.lang.String"
},
{
"sourceType": "com.feeler.interlive.config.MqProduceClientConfig",
"name": "rocketmq.produce.name-server",
"type": "java.lang.String"
},
{
"sourceType": "com.feeler.interlive.config.MqProduceClientConfig",
"name": "rocketmq.produce.tags",
"type": "java.util.Map<java.lang.String,java.lang.String>"
},
{
"sourceType": "com.feeler.interlive.config.MqProduceClientConfig",
"name": "rocketmq.produce.
23ff7
topics",
"type": "java.util.Map<java.lang.String,java.lang.String>"
}
]
}

到此为止,已经实现了基于前缀配置和自动提示功能

参考:https://www.geek-share.com/detail/2703791696.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: