sunrays-framework配置重构
文章目录
- 1.common-log4j2-starter
- 1.目录结构
- 2.Log4j2Properties.java 新增两个属性
- 3.Log4j2AutoConfiguration.java 条件注入LogAspect
- 4.ApplicationEnvironmentPreparedListener.java 从Log4j2Properties.java中定义的配置读取信息
- 2.common-minio-starter
- 1.MinioProperties.java
- 3.common-mybatis-plus-starter
- 1.目录结构
- 2.BaseEntity.java
- 3.SunRaysBaseServiceImpl.java 删除掉事务注解
- 4.MyBatisPlusProperties.java 统一配置
- 5.MybatisPLusAutoConfiguration.java
- 6.application.yml 提供通用配置
- 7.pom.xml 排除logging
- 4.common-openai-starter-demo
- 1.目录结构
- 2.OpenAiProperties.java
1.common-log4j2-starter
1.目录结构

2.Log4j2Properties.java 新增两个属性
package com.sunxiansheng.log4j2.config.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;/*** Description: 日志切面配置** @Author sun* @Create 2024/10/24 23:16* @Version 1.0*/
@ConfigurationProperties(prefix = "sun-rays.log4j2")
@Data
public class Log4j2Properties {/*** 是否开启日志切面*/private boolean logAspectEnable = true;/*** 日志存储根目录*/private String home = "./logs";/*** 日志模块(从仓库中最顶级的模块开始) 例如:sunrays-framework/sunrays-demo/common-log4j2-starter-demo*/private String module = "defaultModule";
}
3.Log4j2AutoConfiguration.java 条件注入LogAspect
package com.sunxiansheng.log4j2.config;import com.sunxiansheng.log4j2.aspectj.LogAspect;
import com.sunxiansheng.log4j2.config.properties.Log4j2Properties;
import com.sunxiansheng.log4j2.trace.TraceIdFilter;
import lombok.extern.slf4j.Slf4j;
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.PostConstruct;/*** Description: Log4j2自动配置类** @Author sun* @Create 2024/10/24 10:36* @Version 1.0*/
@Configuration
@EnableConfigurationProperties({Log4j2Properties.class}) // 启用配置类
@Slf4j
public class Log4j2AutoConfiguration {/*** 自动配置成功日志*/@PostConstructpublic void logConfigSuccess() {log.info("Log4j2AutoConfiguration has been loaded successfully!");}/*** 条件注入LogAspect** @return*/@Bean@ConditionalOnMissingBean@ConditionalOnProperty(name = "sun-rays.log4j2.log-aspect-enable", havingValue = "true", matchIfMissing = true)LogAspect logAspect() {log.info("LogAspect 成功注入!");return new LogAspect();}/*** 条件注入链路追踪过滤器** @return*/@Bean@ConditionalOnMissingBeanTraceIdFilter traceIdFilter() {return new TraceIdFilter();}
}
4.ApplicationEnvironmentPreparedListener.java 从Log4j2Properties.java中定义的配置读取信息
package com.sunxiansheng.log4j2.listener;import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.boot.context.logging.LoggingApplicationListener;
import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered;
import org.springframework.core.env.ConfigurableEnvironment;/*** Description: 配置文件已加载,Environment 对象已初始化* 使用 ApplicationEnvironmentPreparedEvent 读取 application.yml 文件中的 sun-rays-log4j2.home 和 sun-rays-log4j2.module 配置** @Author sun* @Create 2024/12/13 23:53* @Version 1.0*/
public class ApplicationEnvironmentPreparedListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent>, Ordered {@Overridepublic void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {ConfigurableEnvironment environment = event.getEnvironment();// 获取 log.home 属性并提供默认值String logHome = environment.getProperty("sun-rays.log4j2.home", "./logs");if ("./logs".equals(logHome)) {System.err.println("WARNING: sun-rays.log4j2.home 属性未设置,使用默认值: " + logHome);}// 获取 log.module 属性并提供默认值String logModule = environment.getProperty("sun-rays.log4j2.module", "defaultModule");if ("defaultModule".equals(logModule)) {System.err.println("WARNING: sun-rays.log4j2.module 属性未设置,使用默认值: " + logModule);}// 将属性设置为系统属性System.setProperty("log.home", logHome);System.setProperty("log.module", logModule);}/*** 当前监听器的启动顺序需要在日志配置监听器的前面,保证在日志文件初始化之前读取 application.yml 的配置。** @return*/@Overridepublic int getOrder() {return LoggingApplicationListener.DEFAULT_ORDER - 1;}
}
2.common-minio-starter
1.MinioProperties.java
package com.sunxiansheng.minio.config.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;/*** Description: Minio配置** @Author sun* @Create 2024/11/12 23:15* @Version 1.0*/
@ConfigurationProperties(prefix = "sun-rays.minio")
@Data
public class MinioProperties {/*** minio服务地址*/private String endpoint;/*** minio服务用户名*/private String accessKey;/*** minio服务密码*/private String secretKey;
}
3.common-mybatis-plus-starter
1.目录结构

2.BaseEntity.java
package com.sunxiansheng.mybatis.plus.base.entity;import com.baomidou.mybatisplus.annotation.TableField;
import lombok.*;import java.io.Serializable;
import java.util.Date;/*** Description: Entity基类** @Author sun* @Create 2024/10/26 10:35* @Version 1.0*/
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class BaseEntity implements Serializable {private static final long serialVersionUID = 1L;/*** 创建者*/@TableField("create_by") // 数据库中的字段名private String createBy;/*** 创建时间*/@TableField("create_time") // 数据库中的字段名private Date createTime;/*** 更新者*/@TableField("update_by") // 数据库中的字段名private String updateBy;/*** 更新时间*/@TableField("update_time") // 数据库中的字段名private Date updateTime;
}
3.SunRaysBaseServiceImpl.java 删除掉事务注解
package com.sunxiansheng.mybatis.plus.base.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sunxiansheng.mybatis.plus.base.service.SunRaysBaseService;import java.io.Serializable;
import java.util.List;/*** Description: SunRays-Framework 基础Service实现类** @Author sun* @Create 2024/10/25 17:38* @Version 1.0*/
public class SunRaysBaseServiceImpl<M extends BaseMapper<T>, T, ID extends Serializable>implements SunRaysBaseService<T, ID> {// Mapper字段,私有化处理,不允许子类直接访问,只能通过Setter注入private M mybatisPlusMapper;// Setter方法用于注入MyBatis-Plus Mapperpublic void setMybatisPlusMapper(M mybatisPlusMapper) {this.mybatisPlusMapper = mybatisPlusMapper;}// ============================== 基于事务的CRUD方法 ==============================@Overridepublic boolean existsById(ID id) {T t = mybatisPlusMapper.selectById(id);return t != null;}@Overridepublic boolean exists(T po) {QueryWrapper<T> queryWrapper = new QueryWrapper<>(po);return mybatisPlusMapper.exists(queryWrapper);}@Overridepublic Long count(T po) {QueryWrapper<T> queryWrapper = new QueryWrapper<>(po);return mybatisPlusMapper.selectCount(queryWrapper);}@Overridepublic T listById(ID id) {return mybatisPlusMapper.selectById(id);}@Overridepublic T listOne(T po) {return mybatisPlusMapper.selectOne(new QueryWrapper<>(po));}@Overridepublic List<T> listAll(T po) {QueryWrapper<T> queryWrapper = new QueryWrapper<>(po);return mybatisPlusMapper.selectList(queryWrapper);}@Overridepublic int insertOne(T po) {return mybatisPlusMapper.insert(po);}@Overridepublic int updateById(T po) {return mybatisPlusMapper.updateById(po);}@Overridepublic int update(T po, T condition) {QueryWrapper<T> queryWrapper = new QueryWrapper<>(condition);return mybatisPlusMapper.update(po, queryWrapper);}@Overridepublic int deleteById(ID id) {return mybatisPlusMapper.deleteById(id);}@Overridepublic int deleteBatchByIds(List<ID> ids) {return mybatisPlusMapper.deleteBatchIds(ids);}@Overridepublic int delete(T po) {QueryWrapper<T> queryWrapper = new QueryWrapper<>(po);return mybatisPlusMapper.delete(queryWrapper);}
}
4.MyBatisPlusProperties.java 统一配置
package com.sunxiansheng.mybatis.plus.config.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;/*** Description: MyBatisPlus配置** @Author sun* @Create 2025/1/3 21:36* @Version 1.0*/
@ConfigurationProperties(prefix = "sun-rays.mybatis-plus")
@Data
public class MyBatisPlusProperties {/*** 是否启用sql美化*/private boolean sqlBeautyEnabled = true;
}
5.MybatisPLusAutoConfiguration.java
package com.sunxiansheng.mybatis.plus.config;import com.sunxiansheng.mybatis.plus.config.properties.MyBatisPlusProperties;
import com.sunxiansheng.mybatis.plus.interceptor.SqlBeautyInterceptor;
import lombok.extern.slf4j.Slf4j;
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.PostConstruct;/*** Description: MybatisPLus自动配置类** @Author sun* @Create 2024/10/23 23:00* @Version 1.0*/
@Configuration
@EnableConfigurationProperties({MyBatisPlusProperties.class}) // 启用配置类
@Slf4j
public class MybatisPLusAutoConfiguration {/*** 自动配置成功日志*/@PostConstructpublic void logConfigSuccess() {log.info("MybatisPLusAutoConfiguration has been loaded successfully!");}/*** SQL美化拦截器*/@Bean@ConditionalOnMissingBean@ConditionalOnProperty(prefix = "sun-rays.mybatis-plus", value = "sql-beauty-enabled", havingValue = "true", matchIfMissing = true)public SqlBeautyInterceptor sqlBeautyInterceptor() {log.info("SqlBeautyInterceptor 成功注入!");return new SqlBeautyInterceptor();}
}
6.application.yml 提供通用配置
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource # druid连接池druid:initial-size: 10 # 初始化连接数(适当减少以节省资源)min-idle: 10 # 最小空闲连接数max-active: 50 # 最大连接数(根据业务需求调整)max-wait: 30000 # 获取连接的最大等待时间(30秒)timeBetweenEvictionRunsMillis: 60000 # 每60秒检查一次空闲连接minEvictableIdleTimeMillis: 300000 # 最小空闲时间5分钟后回收testWhileIdle: true # 检查空闲连接是否可用testOnBorrow: true # 检查从连接池获取的连接是否可用removeAbandoned: true # 启用清理超时连接removeAbandonedTimeout: 180 # 连接超时时间180秒logAbandoned: true # 记录被清理的连接日志
7.pom.xml 排除logging
<!-- jdbc -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><exclusions><exclusion><artifactId>spring-boot-starter-logging</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions>
</dependency>
4.common-openai-starter-demo
1.目录结构

2.OpenAiProperties.java
package com.sunxiansheng.openai.config.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;/*** Description: OpenAI配置属性类** @Author sun* @Create 2024/12/14 11:44* @Version 1.0*/
@Data
@ConfigurationProperties(prefix = "sun-rays.openai")
public class OpenAiProperties {/*** OpenAI API Key*/private String apiKey;/*** OpenAI API URL 有默认值*/private String apiUrl = "https://api.openai.com/v1/chat/completions";
}
相关文章:
sunrays-framework配置重构
文章目录 1.common-log4j2-starter1.目录结构2.Log4j2Properties.java 新增两个属性3.Log4j2AutoConfiguration.java 条件注入LogAspect4.ApplicationEnvironmentPreparedListener.java 从Log4j2Properties.java中定义的配置读取信息 2.common-minio-starter1.MinioProperties.…...
Spark Streaming的背压机制的原理与实现代码及分析
Spark Streaming的背压机制是一种根据JobScheduler反馈的作业执行信息来动态调整Receiver数据接收率的机制。 在Spark 1.5.0及以上版本中,可以通过设置spark.streaming.backpressure.enabled为true来启用背压机制。当启用背压机制时,Spark Streaming会自…...
刷题记录 贪心算法-2:455. 分发饼干
题目:455. 分发饼干 难度:简单 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸&a…...
360大数据面试题及参考答案
数据清理有哪些方法? 数据清理是指发现并纠正数据文件中可识别的错误,包括检查数据一致性,处理无效值和缺失值等。常见的数据清理方法有以下几种: 去重处理:数据中可能存在重复的记录,这不仅会占用存储空间,还可能影响分析结果。通过对比每条记录的关键属性,若所有关键…...
【大模型】Ollama+AnythingLLM搭建RAG大模型私有知识库
文章目录 一、AnythingLLM简介二、搭建本地智能知识库2.1 安装Ollama2.2 安装AnythingLLM 参考资料 一、AnythingLLM简介 AnythingLLM是由Mintplex Labs Inc.开发的一个全栈应用程序,是一款高效、可定制、开源的企业级文档聊天机器人解决方案。AnythingLLM能够将任…...
深入MapReduce——从MRv1到Yarn
引入 我们前面篇章有提到,和MapReduce的论文不太一样。在Hadoop1.0实现里,每一个MapReduce的任务并没有一个独立的master进程,而是直接让调度系统承担了所有的worker 的master 的角色,这就是Hadoop1.0里的 JobTracker。在Hadoop1…...
arkui-x 前端布局编码模板
build() {Column() {Row() {// 上侧页面布局实现}// 下侧页面布局实现}.width(Const.THOUSANDTH_1000).height(Const.THOUSANDTH_1000).justifyContent(FlexAlign.SpaceBetween).backgroundImage($r(app.media.background_xxx)).backgroundImageSize(ImageSize.Cover).backgrou…...
代理模式 -- 学习笔记
代理模式学习笔记 什么是代理? 代理是一种设计模式,用户可以通过代理操作,而真正去进行处理的是我们的目标对象,代理可以在方法增强(如:记录日志,添加事务,监控等) 拿一…...
sem_init的概念和使用案例
sem_init 是 POSIX 线程库中用于初始化未命名信号量(unnamed semaphore)的函数,常用于多线程或多进程间的同步。以下是其概念和使用案例的详细说明: 概念 函数原型: #include <semaphore.h>int sem_init(sem_t …...
JVM_类的加载、链接、初始化、卸载、主动使用、被动使用
①. 说说类加载分几步? ①. 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段: 第一过程的加载(loading)也称为装载验证、准备、解析3个部分统称为链接(Linking)在Java中数据类型分为基本数据类型和引用数据…...
ProfibusDP主机与从机交互
ProfibusDP 主机SD2索要数据下发:68 08 F7 68 01 02 03 21 05 06 07 08 1C 1668:SD2 08:LE F7:LEr 68:SD2 01:目的地址 02:源地址 03:FC_CYCLIC_DATA_EXCHANGE功能码 21:数据地址 05,06,07,08&a…...
Java设计模式:结构型模式→组合模式
Java 组合模式详解 1. 定义 组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次。组合模式使得客户端能够以统一的方式对待单个对象和对象集合的一致性,有助于处理树形结构…...
【福州市AOI小区面】shp数据学校大厦商场等占地范围面数据内容测评
AOI城区小区面样图和数据范围查看: — 字段里面有name字段。分类比较多tpye:每个值代表一个类型。比如字段type中1549代表小区住宅,1563代表学校。小区、学校等占地面积范围数据 —— 小区范围占地面积面数据shp格式 无偏移坐标,只…...
【Python实现机器遗忘算法】复现2023年TNNLS期刊算法UNSIR
【Python实现机器遗忘算法】复现2023年TNNLS期刊算法UNSIR 1 算法原理 Tarun A K, Chundawat V S, Mandal M, et al. Fast yet effective machine unlearning[J]. IEEE Transactions on Neural Networks and Learning Systems, 2023. 本文提出了一种名为 UNSIR(Un…...
基于SpringBoot的阳光幼儿园管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
【逻辑学导论第15版】A. 推理
识别下列语段中的前提与结论。有些前提确实支持结论,有些并不支持。请注意,前提可能直接或间接地支持结论,而简单的语段也可能包含不止一个论证。 例题: 1.管理得当的民兵组织对于一个自由国家的安全是必需的,因而人民…...
【开源免费】基于SpringBoot+Vue.JS景区民宿预约系统(JAVA毕业设计)
本文项目编号 T 162 ,文末自助获取源码 \color{red}{T162,文末自助获取源码} T162,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
c++ map/multimap容器 学习笔记
1 map的基本概念 简介: map中所有的元素都是pair pair中第一个元素是key(键),第二个元素是value(值) 所有元素都会根据元素的键值自动排序。本质: map/multimap 属于关联式容器,底…...
安卓逆向之脱壳-认识一下动态加载 双亲委派(一)
安卓逆向和脱壳是安全研究、漏洞挖掘、恶意软件分析等领域的重要环节。脱壳(unpacking)指的是去除应用程序中加固或保护措施的过程,使得可以访问应用程序的原始代码或者数据。脱壳的重要性: 分析恶意软件:很多恶意软件…...
64位的谷歌浏览器Chrome/Google Chrome
64位的谷歌浏览器Chrome/Google Chrome 在百度搜索关键字:chrome,即可下载官方的“谷歌浏览器Chrome/Google Chrome”,但它可能是32位的(切记注意网址:https://www.google.cn/...., 即:google.cnÿ…...
马尔科夫模型和隐马尔科夫模型区别
我用一个天气预报和海藻湿度观测的比喻来解释,保证你秒懂! 1. 马尔可夫模型(Markov Model, MM) 特点:状态直接可见 场景:天气预报(晴天→雨天→阴天…)核心假设: 下一个…...
Python NumPy(7):连接数组、分割数组、数组元素的添加与删除
1 连接数组 函数描述concatenate连接沿现有轴的数组序列stack沿着新的轴加入一系列数组。hstack水平堆叠序列中的数组(列方向)vstack竖直堆叠序列中的数组(行方向) 1.1 numpy.concatenate numpy.concatenate 函数用于沿指定轴连…...
【LLM】deepseek多模态之Janus-Pro和JanusFlow框架
note 文章目录 note一、Janus-Pro:解耦视觉编码,实现多模态高效统一技术亮点模型细节 二、JanusFlow:融合生成流与语言模型,重新定义多模态技术亮点模型细节 Reference 一、Janus-Pro:解耦视觉编码,实现多模…...
2000-2021年 全国各地级市专利申请与获得情况、绿色专利申请与获得情况数据
2000-2021年 全国各地级市专利申请与获得情况、绿色专利申请与获得情况数据.ziphttps://download.csdn.net/download/2401_84585615/89575931 https://download.csdn.net/download/2401_84585615/89575931 2000至2021年,全国各地级市的专利申请与获得情况呈现出显著…...
51单片机(STC89C52)开发:点亮一个小灯
软件安装: 安装开发板CH340驱动。 安装KEILC51开发软件:C51V901.exe。 下载软件:PZ-ISP.exe 创建项目: 新建main.c 将main.c加入至项目中: main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…...
数仓ETL测试
提取,转换和加载有助于组织使数据在不同的数据系统中可访问,有意义且可用。ETL工具是用于提取,转换和加载数据的软件。在当今数据驱动的世界中,无论大小如何,都会从各种组织,机器和小工具中生成大量数据。 …...
240. 搜索二维矩阵||
参考题解:https://leetcode.cn/problems/search-a-2d-matrix-ii/solutions/2361487/240-sou-suo-er-wei-ju-zhen-iitan-xin-qin-7mtf 将矩阵旋转45度,可以看作一个二叉搜索树。 假设以左下角元素为根结点, 当target比root大的时候ÿ…...
反向代理模块b
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
Kafka的内部通信协议
引言 kafka内部用到的常见协议和优缺点可以看看原文 Kafka用到的协议 本文奖详细探究kafka核心通信协议和高性能的关键 网络层通信的实现 基于 Java NIO:Kafka 的网络通信层主要基于 Java NIO 来实现,这使得它能够高效地处理大量的连接和数据传输。…...
Excel - Binary和Text两种Compare方法
Option Compare statement VBA里可以定义默认使用的compare方法: Set the string comparison method to Binary. Option Compare Binary That is, "AAA" is less than "aaa". Set the string comparison method to Text. Option Compare Tex…...
