IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Spring Boot 手写一个 Starter -> 正文阅读

[游戏开发]Spring Boot 手写一个 Starter

对于自动装配的原理进行分析之后,我们可以基于这个机制来实现一个Starter组件,以便于加深大家对自动装配及Starter组件的理解。同时,Spring Boot 官方提供的 Starter 并不能囊括所有的技术组件,在工作中,如果自己的项目需要支持 Spring Boot ,也需要开发Starter组件。

Spring Boot 官方提供的 Starter 的作用来看,Starter组件主要包括三个功能:

  • 涉及相关组件的Jar包依赖
  • 自动实现Bean的装配
  • 自动声明并且加载application.properties文件中的配置

下面我们来先了解一下 Starter 组件的命名规范

Starter 的命名规范

Starter 的命名主要分为两类,一类是官方命名,另一类是自定义组件命名,这种命名格式并不是强制性的,也是一种约定俗成的方式,可以让开发者更容易识别

  • 官方命名的格式为:spring-boot-starter-模块名称,比如 spring-boot-starter-web
  • 自定义命名格式:模块名称-spring-boot-starter,比如 mybatis-spring-boot-starter

简单来说,官方命名中模块名放在最后,而自定义组件中模块名放在最前面

实现基于 Redis 的 Starter

1、添加依赖

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.13.0</version>
</dependency>

2、定义属性类

/**
 * redis配置信息
 * @author itwolf
 * @date 2022/03/05 10:00
 */
@Data
@Component
@ConfigurationProperties(prefix = "redisson")
public class RedissonProperties {


    private String host;

    private int port;

    private String password;

    private int database;

    private int connectTimeout;

    private int connectionPoolSize;

    private int connectionMinimumIdleSize;


    private String[] clusterNodes;

    private int pingConnectionInterval = 1000;
}

@ConfigurationProperties(prefix = "redisson")

这个redission配置在nacos的yaml文件

3、定义需要自动装配的配置类

Redission支持集群,主从,哨兵等模式的配置,有兴趣的话,可以基于nacos配置,建议使用config.fromYAML方式,直接加载配置完成不同模式的初始化

package server.config;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
 * redis配置
 * @author itwolf
 * @since 2022/03/05 10:00
 */
@Slf4j
@Configuration
public class RedissonConfig {

    @Resource
    private RedissonProperties redissonProperties;

    @Bean(destroyMethod = "shutdown")
    public RedissonClient redissonClient() {

        Config config = new Config();
        config.setCodec(new JsonJacksonCodec());

        String host = redissonProperties.getHost();
        if (StringUtils.isBlank(host)) {
            throw new IllegalArgumentException("redis connect error, no config redis host.");
        }

        String[] nodes = StringUtils.split(host, ",");
        if (nodes.length == 1) {
            String address = "redis://" + redissonProperties.getHost();
            log.info("Redis Single Mode, user address: {}, pingConnectionInterval", address, redissonProperties.getPingConnectionInterval());
            config.useSingleServer().setAddress(address)
                    .setPassword(redissonProperties.getPassword())
                    .setConnectionPoolSize(redissonProperties.getConnectionPoolSize())
                    .setConnectionMinimumIdleSize(redissonProperties.getConnectionMinimumIdleSize())
                    .setConnectTimeout(redissonProperties.getConnectTimeout())
                    .setPingConnectionInterval(redissonProperties.getPingConnectionInterval());

        } else {
            int len = nodes.length;
            String[] clusterNodes = new String[nodes.length];
            for (int i = 0; i < len; i++) {
                clusterNodes[i] = "redis://" + nodes[i];
            }
            log.info("redis cluster mode, user address: {}", StringUtils.join(clusterNodes, ","));
            config.useClusterServers()
                    .setConnectTimeout(redissonProperties.getConnectTimeout())
                    .setMasterConnectionPoolSize(redissonProperties.getConnectionPoolSize())
                    .setMasterConnectionMinimumIdleSize(redissonProperties.getConnectionMinimumIdleSize())
                    .addNodeAddress(clusterNodes)
                    .setPassword(redissonProperties.getPassword())
                    .setPingConnectionInterval(redissonProperties.getPingConnectionInterval());
        }

        return Redisson.create(config);
    }

}

4、在 resouces 下创建 META-INF/spring.factories文件,使得Spring Boot 程序可以扫描到该文件完成自动装配,key和value对应如下

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.user.RedissonConfig

5、最后一步,使用阶段做两个步骤,添加?Starter 依赖、设置属性配置

<dependency>
	<groupId>com.user.book</groupId>
	<artifactId>redis-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

application.properties文件 配置 host 和 port

itwolf.redission.host=localhost

itwolf.redis.port=6379

这个properties可以修改yaml文件的nacos配置,后面会讲到关于nacos服务注册与发现

先看看这个nacos的配置,预先了解nacos配置中心

在nacos配置中心创建

yaml文件

redisson:
  host: 127.0.0.1:6379
  password: 123456
  timeout: 1000
  connectionPoolSize: 300
  connectionMinimumIdleSize: 50
  connectTimeout: 1000

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 12:10:15  更:2022-04-28 12:11:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/17 1:01:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码