sunrays-framework配置重构

news2025/1/30 11:07:18

文章目录

    • 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 {

    /**
     * 自动配置成功日志
     */
    @PostConstruct
    public 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
    @ConditionalOnMissingBean
    TraceIdFilter 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 {

    @Override
    public 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
     */
    @Override
    public 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 Mapper
    public void setMybatisPlusMapper(M mybatisPlusMapper) {
        this.mybatisPlusMapper = mybatisPlusMapper;
    }

    // ============================== 基于事务的CRUD方法 ==============================

    @Override
    public boolean existsById(ID id) {
        T t = mybatisPlusMapper.selectById(id);
        return t != null;
    }

    @Override
    public boolean exists(T po) {
        QueryWrapper<T> queryWrapper = new QueryWrapper<>(po);
        return mybatisPlusMapper.exists(queryWrapper);
    }

    @Override
    public Long count(T po) {
        QueryWrapper<T> queryWrapper = new QueryWrapper<>(po);
        return mybatisPlusMapper.selectCount(queryWrapper);
    }

    @Override
    public T listById(ID id) {
        return mybatisPlusMapper.selectById(id);
    }

    @Override
    public T listOne(T po) {
        return mybatisPlusMapper.selectOne(new QueryWrapper<>(po));
    }

    @Override
    public List<T> listAll(T po) {
        QueryWrapper<T> queryWrapper = new QueryWrapper<>(po);
        return mybatisPlusMapper.selectList(queryWrapper);
    }

    @Override
    public int insertOne(T po) {
        return mybatisPlusMapper.insert(po);
    }

    @Override
    public int updateById(T po) {
        return mybatisPlusMapper.updateById(po);
    }

    @Override
    public int update(T po, T condition) {
        QueryWrapper<T> queryWrapper = new QueryWrapper<>(condition);
        return mybatisPlusMapper.update(po, queryWrapper);
    }

    @Override
    public int deleteById(ID id) {
        return mybatisPlusMapper.deleteById(id);
    }

    @Override
    public int deleteBatchByIds(List<ID> ids) {
        return mybatisPlusMapper.deleteBatchIds(ids);
    }

    @Override
    public 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 {

    /**
     * 自动配置成功日志
     */
    @PostConstruct
    public 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.Driver
    type: 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.coloradmin.cn/o/2286393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大模型】Ollama+AnythingLLM搭建RAG大模型私有知识库

文章目录 一、AnythingLLM简介二、搭建本地智能知识库2.1 安装Ollama2.2 安装AnythingLLM 参考资料 一、AnythingLLM简介 AnythingLLM是由Mintplex Labs Inc.开发的一个全栈应用程序&#xff0c;是一款高效、可定制、开源的企业级文档聊天机器人解决方案。AnythingLLM能够将任…

代理模式 -- 学习笔记

代理模式学习笔记 什么是代理&#xff1f; 代理是一种设计模式&#xff0c;用户可以通过代理操作&#xff0c;而真正去进行处理的是我们的目标对象&#xff0c;代理可以在方法增强&#xff08;如&#xff1a;记录日志&#xff0c;添加事务&#xff0c;监控等&#xff09; 拿一…

JVM_类的加载、链接、初始化、卸载、主动使用、被动使用

①. 说说类加载分几步&#xff1f; ①. 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段: 第一过程的加载(loading)也称为装载验证、准备、解析3个部分统称为链接(Linking)在Java中数据类型分为基本数据类型和引用数据…

ProfibusDP主机与从机交互

ProfibusDP 主机SD2索要数据下发&#xff1a;68 08 F7 68 01 02 03 21 05 06 07 08 1C 1668&#xff1a;SD2 08&#xff1a;LE F7&#xff1a;LEr 68&#xff1a;SD2 01:目的地址 02&#xff1a;源地址 03:FC_CYCLIC_DATA_EXCHANGE功能码 21&#xff1a;数据地址 05,06,07,08&a…

Java设计模式:结构型模式→组合模式

Java 组合模式详解 1. 定义 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构以表示“部分-整体”的层次。组合模式使得客户端能够以统一的方式对待单个对象和对象集合的一致性&#xff0c;有助于处理树形结构…

【福州市AOI小区面】shp数据学校大厦商场等占地范围面数据内容测评

AOI城区小区面样图和数据范围查看&#xff1a; — 字段里面有name字段。分类比较多tpye&#xff1a;每个值代表一个类型。比如字段type中1549代表小区住宅&#xff0c;1563代表学校。小区、学校等占地面积范围数据 —— 小区范围占地面积面数据shp格式 无偏移坐标&#xff0c;只…

【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&#xff08;Un…

基于SpringBoot的阳光幼儿园管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【开源免费】基于SpringBoot+Vue.JS景区民宿预约系统(JAVA毕业设计)

本文项目编号 T 162 &#xff0c;文末自助获取源码 \color{red}{T162&#xff0c;文末自助获取源码} T162&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

安卓逆向之脱壳-认识一下动态加载 双亲委派(一)

安卓逆向和脱壳是安全研究、漏洞挖掘、恶意软件分析等领域的重要环节。脱壳&#xff08;unpacking&#xff09;指的是去除应用程序中加固或保护措施的过程&#xff0c;使得可以访问应用程序的原始代码或者数据。脱壳的重要性&#xff1a; 分析恶意软件&#xff1a;很多恶意软件…

马尔科夫模型和隐马尔科夫模型区别

我用一个天气预报和海藻湿度观测的比喻来解释&#xff0c;保证你秒懂&#xff01; 1. 马尔可夫模型&#xff08;Markov Model, MM&#xff09; 特点&#xff1a;状态直接可见 场景&#xff1a;天气预报&#xff08;晴天→雨天→阴天…&#xff09;核心假设&#xff1a; 下一个…

Python NumPy(7):连接数组、分割数组、数组元素的添加与删除

1 连接数组 函数描述concatenate连接沿现有轴的数组序列stack沿着新的轴加入一系列数组。hstack水平堆叠序列中的数组&#xff08;列方向&#xff09;vstack竖直堆叠序列中的数组&#xff08;行方向&#xff09; 1.1 numpy.concatenate numpy.concatenate 函数用于沿指定轴连…

【LLM】deepseek多模态之Janus-Pro和JanusFlow框架

note 文章目录 note一、Janus-Pro&#xff1a;解耦视觉编码&#xff0c;实现多模态高效统一技术亮点模型细节 二、JanusFlow&#xff1a;融合生成流与语言模型&#xff0c;重新定义多模态技术亮点模型细节 Reference 一、Janus-Pro&#xff1a;解耦视觉编码&#xff0c;实现多模…

2000-2021年 全国各地级市专利申请与获得情况、绿色专利申请与获得情况数据

2000-2021年 全国各地级市专利申请与获得情况、绿色专利申请与获得情况数据.ziphttps://download.csdn.net/download/2401_84585615/89575931 https://download.csdn.net/download/2401_84585615/89575931 2000至2021年&#xff0c;全国各地级市的专利申请与获得情况呈现出显著…

51单片机(STC89C52)开发:点亮一个小灯

软件安装&#xff1a; 安装开发板CH340驱动。 安装KEILC51开发软件&#xff1a;C51V901.exe。 下载软件&#xff1a;PZ-ISP.exe 创建项目&#xff1a; 新建main.c 将main.c加入至项目中&#xff1a; main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…

240. 搜索二维矩阵||

参考题解&#xff1a;https://leetcode.cn/problems/search-a-2d-matrix-ii/solutions/2361487/240-sou-suo-er-wei-ju-zhen-iitan-xin-qin-7mtf 将矩阵旋转45度&#xff0c;可以看作一个二叉搜索树。 假设以左下角元素为根结点&#xff0c; 当target比root大的时候&#xff…

反向代理模块b

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

EasyExcel使用详解

文章目录 EasyExcel使用详解一、引言二、环境准备与基础配置1、添加依赖2、定义实体类 三、Excel 读取详解1、基础读取2、自定义监听器3、多 Sheet 处理 四、Excel 写入详解1、基础写入2、动态列与复杂表头3、样式与模板填充 五、总结 EasyExcel使用详解 一、引言 EasyExcel 是…

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…