SpringBoot 自动配置 (1) - 自定义简单 Starter (Gradle)

前言

SpringBoot 的核心理念就是 “约定大于配置”,这一理念最终是通过开箱即用的 Starter 模块来实现的。
例如想要在 SpringBoot 项目中集成 Redis,那么只需要加入 spring-data-redis-starter 的依赖,并简单配置一下连接信息就可以。这为我们省去了之前很多的配置操作。

编写 Starter Demo

创建一个 Gradle 项目:demo-spring-boot-starter
引入以下依赖:

dependencies {
    compile 'org.springframework.boot:spring-boot-autoconfigure'
    compile 'org.springframework.boot:spring-boot-configuration-processor'
}

属性类

新建属性类 CustomProperties。通过 @ConfigurationProperties 注解指定这是一个配置类,并设置注解的 prefix 属性值指定配置项的前缀。

@ConfigurationProperties(prefix = "demo.springboot.starter")
public class CustomProperties {
    private String herb = "default";

    public String getHerb() {  return herb; }
    public void setHerb(String herb) { this.herb = herb; }
}

服务接口

定义一个服务类 CustomService 供引用该 Starter 的工程调用,提供 sayHello 方法用于测试输出。

public class CustomService {
    private CustomProperties customProperties;

    @Autowired
    public void setCustomProperties(CustomProperties customProperties) {
        this.customProperties = customProperties;
    }

    public String sayHello(String name) {
        return String.format("This is %s speaking, my favourite kind of herb is %s.", name, customProperties.getHerb());
    }
}

自动配置类

在 Starter 中,会有若干 AutoConfiguration 类,这些类会通过定义的配置进行一些初始化工作,可能是初始化一些Bean,也可能是执行一些业务逻辑。
@Configuration 指明该类是一个 JAVA Config 类;@EnableConfigurationProperties 启用自定义的配置类,这样这个配置类才会被自动装配。

@Configuration
@EnableConfigurationProperties(CustomProperties.class)
public class CustomAutoConfiguration {

    @Bean
    public CustomService customService() {
        return new CustomService();
    }
}

在 src/main/resource/META-INF 目录下创建配置文件 spring.factories。Spring 内部使用一种工厂加载机制 (Factory Loading Mechanism),这种机制通过 SpringFactoriesLoader 完成,后者通过检索这个文件中的内容,获取到指定的配置类,或是对相应的 Bean 进行有选择 (@ConditionalOnXxx) 的实例化。

# 自动初始化配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.caplike.demo.CustomAutoConfiguration

上传 Starter

我们需要将自定义的 Starter 上传到内部仓库或者本地仓库才能供其他工程依赖。
本文以本地仓库作示范,修改 build.gradle 文件,新增任务 uploadArchives:

运行 uploadArchives 即可上传到本地仓库。

使用自定义 Starter

新建 Web 测试工程并编写入口类以打印配置内容:

@SpringBootApplication
public class SampleApplication {
    private static CustomService customService;

    public static void main(String[] args) {
        SpringApplication.run(SampleApplication.class);
        System.out.println(customService.sayHello("caplike"));
    }

    @Autowired
    public void setCustomService(CustomService customService) {
        SampleApplication.customService = customService;
    }
}

启动 Web,可以看到控制台输出:This is caplike speaking, my favourite kind of herb is default.

元数据配置

如果按照以上步骤实现自定义 Starter,在测试工程的 application.properties 中配置属性 demo.springboot.starter.herb 时,并不会有提示信息。这是因为你并没有配置元数据。在 Spring Boot 官方文档中提到,可以新建 META-INF/additional-spring-configuration-metadata.json文件,进行元数据配置。

然后重新上传自定义的 Starter,刷新测试工程的 Gradle 依赖,就可以看到提示信息了:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MQTT 是一种轻量级的消息传输协议,可以帮助我们实现设备之间的通信和数据交换。Spring Boot 是一个非常流行的 Java Web 开发框架,提供了很多方便的工具和组件,可以帮助我们快速构建 Web 应用程序。将 MQTT 封装成 Spring Boot 自定义 starter,可以更方便地在 Spring Boot 项目中使用 MQTT。 下面是如何将 MQTT 封装成 Spring Boot 自定义 starter 的步骤: 1. 创建一个 Spring Boot 项目 首先,我们需要创建一个新的 Spring Boot 项目。可以使用 Spring Initializr 或者手动创建一个 Maven 或 Gradle 项目。 2. 添加 MQTT 依赖 在 pom.xml 或 build.gradle 文件中添加 MQTT 的依赖,例如: ```xml <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.5</version> </dependency> ``` 3. 创建 MQTT 工具类 创建一个 MQTT 工具类,用于连接 MQTT 服务器、订阅主题、发布消息等操作。可以参考 Eclipse Paho 官方文档编写 MQTT 工具类。 4. 创建自定义 starter 创建一个新的模块,用于封装 MQTT 工具类,可以命名为 mqtt-spring-boot-starter。 在该模块的 pom.xml 或 build.gradle 文件中添加 Spring Boot Starter 的依赖,例如: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.4.5</version> </dependency> ``` 在 src/main/resources/META-INF 目录下创建 spring.factories 文件,内容如下: ``` org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.mqtt.MqttAutoConfiguration ``` 其中,`com.example.mqtt.MqttAutoConfiguration` 是自动配置类的全限定名,用于将 MQTT 工具类注入到 Spring 容器中。 5. 创建自动配置类 创建一个自动配置类,用于将 MQTT 工具类注入到 Spring 容器中。可以参考 Spring Boot 官方文档编写自动配置类。 ```java @Configuration @ConditionalOnClass({MqttClient.class}) @EnableConfigurationProperties(MqttProperties.class) public class MqttAutoConfiguration { @Bean @ConditionalOnMissingBean public MqttClient mqttClient(MqttProperties properties) throws MqttException { MqttClient mqttClient = new MqttClient(properties.getBrokerUrl(), properties.getClientId(), new MemoryPersistence()); mqttClient.connect(); return mqttClient; } @Bean @ConditionalOnMissingBean public MqttTemplate mqttTemplate(MqttClient mqttClient) { return new MqttTemplate(mqttClient); } } ``` 在上面的代码中,我们使用了 @ConditionalOnClass 和 @EnableConfigurationProperties 注解来控制自动配置类的启用条件和属性配置。 6. 创建配置文件 在 src/main/resources 目录下创建 application.properties 或 application.yml 文件,用于配置 MQTT 的参数。例如: ```properties mqtt.brokerUrl=tcp://localhost:1883 mqtt.clientId=example-client ``` 7. 测试 使用 Spring Boot 的 starter 机制,我们可以非常方便地将自定义的 MQTT Starter 引入到项目中,并直接使用 MQTT 工具类进行操作。例如: ```java @Autowired private MqttTemplate mqttTemplate; public void publishMessage(String topic, String payload) { mqttTemplate.publish(topic, payload.getBytes(), 0, false); } ``` 通过以上步骤,我们就可以将 MQTT 封装成 Spring Boot 自定义 starter,并提供 util 工具访问了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值