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.目录结构

CleanShot 2025-01-03 at 19.32.33@2x

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.目录结构

CleanShot 2025-01-04 at 17.28.52@2x

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.目录结构

CleanShot 2025-01-04 at 17.45.18@2x

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";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9217.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何解决跨浏览器兼容性问题

跨浏览器兼容性问题是指同一网页在不同浏览器中呈现效果不一致,通常由于浏览器渲染引擎、CSS支持、JavaScript执行等差异导致。解决这类问题可以从以下几个方面入手: 一、使用标准化的HTML和CSS 确保你的网页符合W3C标准。浏览器会尽量遵循这些标准,所以通过标准化的代码可…

算法12(力扣739)-每日温度

1、问题 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 2、示例 &#…

54.数字翻译成字符串的可能性|Marscode AI刷题

1.题目 问题描述 小M获得了一个任务&#xff0c;需要将数字翻译成字符串。翻译规则是&#xff1a;0对应"a"&#xff0c;1对应"b"&#xff0c;依此类推直到25对应"z"。一个数字可能有多种翻译方法。小M需要一个程序来计算一个数字有多少种不同的…

立创开发板入门ESP32C3第八课 修改AI大模型接口为deepseek3接口

#原代码用的AI模型是minimax的API接口&#xff0c;现在试着改成最热门的deepseek3接口。# 首先按理解所得&#xff0c;在main文件夹下&#xff0c;有minimax.c和minimax.h, 它们是这个API接口的头文件和实现文件&#xff0c;然后在main.c中被调用。所以我们一步步更改。 申请…

数据分析系列--③RapidMiner算子说明及数据预处理

一、算子说明 1.新建过程 2.算子状态灯 状态灯说明: (1)状态指示灯&#xff1a; 红色:指示灯说明有参数未被设置或输入端口未被连接等问题; 黄色:指示灯说明还未执行算子&#xff0c;不管配置是否基本齐全; 绿色:指示灯说明一切正常&#xff0c;已成功执行算子。 (2)三角…

Airflow:精通Airflow任务依赖

任务依赖关系是任何工作流管理系统的核心概念&#xff0c;Apache Airflow也不例外。它们确定在工作流中执行任务的顺序和条件&#xff0c;确保以正确的顺序完成任务&#xff0c;并确保在相关任务开始之前成功完成先决任务。在本文中我们将探讨Apache Airflow中的任务依赖关系&a…

关于WPF中ComboBox文本查询功能

一种方法是使用事件&#xff08;包括MVVM的绑定&#xff09; <ComboBox TextBoxBase.TextChanged"ComboBox_TextChanged" /> 然而运行时就会发现&#xff0c;这个事件在疯狂的触发&#xff0c;很频繁 在实际应用中&#xff0c;如果关联查询数据库&#xff0…

python——Django 框架

Django 框架 1、简介 Django 是用python语言写的开源web开发框架&#xff0c;并遵循MVC设计。 Django的**主要目的是简便、快速的开发数据库驱动的网站。**它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能…

(开源)基于Django+Yolov8+Tensorflow的智能鸟类识别平台

1 项目简介&#xff08;开源地址在文章结尾&#xff09; 系统旨在为了帮助鸟类爱好者、学者、动物保护协会等群体更好的了解和保护鸟类动物。用户群体可以通过平台采集野外鸟类的保护动物照片和视频&#xff0c;甄别分类、实况分析鸟类保护动物&#xff0c;与全世界各地的用户&…

DeepSeek R1学习

0.回顾&#xff1a; https://blog.csdn.net/Together_CZ/article/details/144431432?ops_request_misc%257B%2522request%255Fid%2522%253A%25226574a586f0850d0329fbb720e5b8d5a9%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id…

25美赛ABCDEF题详细建模过程+可视化图表+参考论文+写作模版+数据预处理

详情见该链接&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 25美国大学生数学建模如何准备&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;-CSDN博客文章浏览阅读791次&#xff0c;点赞13次&#xff0c;收藏7次。通过了解比赛基本…

【Qt】多线程

多线程 QThread 类简介使用线程线程同步互斥锁 QThread 类简介 一个 QThread 类的对象管理一个线程。在设计多线程程序的时候&#xff0c;需要从 QThread 继承定义线程类&#xff0c;并重新定义 QThread 的虚函数 run()&#xff0c;在函数 run() 里处理线程的事件循环。 应用…

微服务(一)

文章目录 项目地址一、微服务1.1 分析User的Domian Verb和Nouns 二、运行docker和k8s2.1 Docker1. 编写dockerfile2. 创建docker image3. 运行docker使用指定端口4. 查看当前运行的镜像5. 停止当前所有运行的docker6. 删除不用的docker images7. 将本地的image上传到hub里 2.2 …

软件架构的演变:从大型机和整体式应用到分布式计算

注&#xff1a;本文为 “软件架构演变” 相关文章合辑。 英文引文机翻&#xff0c;未校。 Evolution of Software Architecture: From Mainframes and Monoliths to Distributed Computing Liv Wong Technical Writer August 06, 2024 Software architecture—the blueprint…

求解旅行商问题的三种精确性建模方法,性能差距巨大

文章目录 旅行商问题介绍三种模型对比求解模型1决策变量目标函数约束条件Python代码 求解模型2决策变量目标函数约束条件Python代码 求解模型3决策变量目标函数约束条件Python代码 三个模型的优势与不足 旅行商问题介绍 旅行商问题 (Traveling Salesman Problem, TSP) 是一个经…

机器学习(三)

一:Logistic Regression(逻辑回归): 1,定义:是一种常用的分类算法&#xff0c;适用于二进制分类问题(binary classification)&#xff0c;输出结果的取值范围为[0,1]&#xff0c;且最终拟合出来的图像是一条S型曲线 2,sigmoid function/logistic function(逻辑函数)&#xff1a…

DFS深度优先搜索

蓝桥杯备赛日记——DFS基础 1.DFS剪枝 OJ2942 数字王国之军训排队 思路 写一个dfs函数&#xff0c;这个dfs函数有两个参数&#xff0c;dep和i&#xff0c;dep表示第dep位同学&#xff0c;i表示打算把所有人分成i支队伍&#xff0c;这个函数的功能是来检测是否能把所有同学分…

C语言自定义数据类型详解(二)——结构体类型(下)

书接上回&#xff0c;前面我们已经给大家介绍了如何去声明和创建一个结构体&#xff0c;如何初始化结构体变量等这些关于结构体的基础知识。下面我们将继续给大家介绍和结构体有关的知识&#xff1a; 今天的主题是&#xff1a;结构体大小的计算并简单了解一下位段的相关知识。…

Niagara学习笔记

橙色 发射器 , 绿色 粒子, 红色 渲染器 Emitter State 发射器状态 Life Cycle Mode&#xff08;生命周期模式&#xff09; 选择Self就是发射器自身管理生命周期 Loop Behavior 决定粒子发射次数 一次&#xff08;Once&#xff09;&#xff1a;发射器只播放一次多次&#…

14-6-3C++STL的list

&#xff08;一&#xff09;list的插入 1.list.insert(pos,elem);//在pos位置插入一个elem元素的拷贝&#xff0c;返回新数据的位置 #include <iostream> #include <list> using namespace std; int main() { list<int> lst; lst.push_back(10); l…