EasyExcel自定义动态下拉框(附加业务对象转换功能)

全文直接复制粘贴即可,测试无误

一、注解类
1、ExcelSelected.java

设置下拉框

@Documented
@Target({ElementType.FIELD})//用此注解用在属性上。
@Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
public @interface ExcelSelected {
    /**
     * 固定下拉内容
     */
    String[] source() default {};


    /**
     * 方式二:提供动态下拉选项的类
     */
    Class<? extends WhExcelDynamicSelect>[] sourceClass() default {};

    /**
     * 设置下拉框的起始行,默认为第二行
     */
    int firstRow() default 1;

    /**
     * 设置下拉框的结束行,默认为最后一行
     */
    int lastRow() default 0x10000;
}
2、TextColumn.java

设置单元格为文本格式

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TextColumn {
    int index(); // 列索引
}
二、Controller类

分为导入数据与导出模板

@Tag(name = "xxxx管理")
@RestController
@RequestMapping("/api/v1/project/people")
@RequiredArgsConstructor
@Slf4j
public class WhProjectPeopleController {

    private final WhProjectPeopleService whProjectPeopleService;

    @GetMapping("/exportDownload")
    @Operation(summary = "导出excel模板")
    public void downloadExcel(HttpServletResponse response) throws IOException {
        //获取输入流,原始模板位置
        String name = "人员信息模板";
        //假如以中文名下载的话,设置下载文件名称
        String filename = "人员信息模板.xlsx";
        //转码,免得文件名中文乱码
        filename = URLEncoder.encode(filename, "UTF-8");
        //设置文件下载头
        response.addHeader("Content-Disposition", "attachment;filename=" + filename);
        response.setContentType("multipart/form-data");
        ExcelUtils.writeExcel(response, filename, name, WhProjectPeopleVO.class, null);
    }

    @PostMapping("/importExcel")
    @Operation(summary = "导入人员数据")
    public Result importExcel(MultipartFile file, HttpServletRequest request) throws IOException {
        if (file.isEmpty()) {
            throw new SzException("excel文件内容为空!");
        }
        List<WhProjectPeopleVO> vos = ExcelUtils.read(file, WhProjectPeopleVO.class);
        if (CollectionUtils.isEmpty(vos)){
            throw new SzException("导入数据失败!");
        }
        Map<String,Integer> result = whProjectPeopleService.importExcel(vos);
        return Result.success(result);
    }

}

三、Service方法

向excel导入数据

    @Override
    @Transactional
    public Map<String, Integer> importExcel(List<WhProjectPeopleVO> vos) {
        Map<String, Integer> params = new HashMap<>();
        if (CollectionUtils.isEmpty(vos)) {
            throw new SzException("数据导入失败!");
        }
        log.info("导入数据:{}" + JSON.toJSONString(vos));
        int count = 0;
        List<WhProjectPeople> peoples = whProjectPeopleConverter.voListToEntity(vos);
        for (WhProjectPeople people : peoples) {
            WhProjectPeopleForm whProjectPeopleForm = whProjectPeopleConverter.entityToForm(people);
            saveProjectPeople(whProjectPeopleForm);
            count++;
            params.put("insert", count);
        }
        return params;
    }
}
四、工具类
1、ExcelUtils.java
public class ExcelUtils {

    /**
     * 将列表以 Excel 响应给前端
     *
     * @param response  响应
     * @param filename  文件名
     * @param sheetName Excel sheet 名
     * @param head      Excel head 头
     * @param data      数据列表
     * @param <T>       泛型,保证 head 和 data 类型的一致性
     * @throws IOException 写入失败的情况
     */
    public static <T> void writeExcel(HttpServletResponse response, String filename, String sheetName,
                                      Class<T> head, List<T> data) throws IOException {

        CellStyleStrategy cellStyleStrategy =
                new CellStyleStrategy(new WriteCellStyle());
        Map<Integer, WhExcelSelectedResolve> selectedMap = resolveSelectedAnnotation(head);

        // 输出 Excel
        EasyExcel.write(response.getOutputStream(), head)
                // 不要自动关闭,交给 Servlet 自己处理
                .autoCloseStream(false)
                //设置表头和填充内容的样式
                .registerWriteHandler(cellStyleStrategy)
                //设置填充内容单元格格式为文本格式
                .registerWriteHandler(new CustomSheetWriteHandler())
                .registerWriteHandler(new SelectedSheetWriteHandler(selectedMap))
                .sheet(sheetName).doWrite(data);

        // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
    }

    /**
     * 将列表以 Excel 响应给前端
     *
     * @param response  响应
     * @param filename  文件名
     * @param sheetName Excel sheet 名
     * @param head      Excel head 头
     * @param data      数据列表
     * @param <T>       泛型,保证 head 和 data 类型的一致性
     * @throws IOException 写入失败的情况
     */
    public static <T> void write(HttpServletResponse response, String filename, String sheetName,
                                 Class<T> head, List<T> data) throws IOException {

        CellStyleStrategy cellStyleStrategy =
                new CellStyleStrategy(new WriteCellStyle());

        // 输出 Excel
        EasyExcel.write(response.getOutputStream(), head)
                .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
                .registerWriteHandler(cellStyleStrategy)
                .sheet(sheetName).doWrite(data);

        // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
    }



    public static <T> List<T> read(MultipartFile file, Class<T> head) throws IOException {
        return EasyExcel.read(file.getInputStream(), head, null)
                // 不要自动关闭,交给 Servlet 自己处理
                .autoCloseStream(false)
                .doReadAllSync();
    }

    /**
     * 解析表头类中的下拉注解
     * @param head 表头类
     * @param <T> 泛型
     * @return Map<下拉框列索引, 下拉框内容> map
     */
    private static <T> Map<Integer, WhExcelSelectedResolve> resolveSelectedAnnotation(Class<T> head) {
        Map<Integer, WhExcelSelectedResolve> selectedMap = new HashMap<>();

        // getDeclaredFields(): 返回全部声明的属性;getFields(): 返回public类型的属性
        Field[] fields = head.getDeclaredFields();
        for (int i = 0; i < fields.length; i++){
            Field field = fields[i];
            // 解析注解信息
            ExcelSelected selected = field.getAnnotation(ExcelSelected.class);
            ExcelProperty property = field.getAnnotation(ExcelProperty.class);
            if (selected != null) {
                WhExcelSelectedResolve excelSelectedResolve = new WhExcelSelectedResolve();
                String[] source = excelSelectedResolve.resolveSelectedSource(selected);
                if (source != null && source.length > 0){
                    excelSelectedResolve.setSource(source);
                    excelSelectedResolve.setFirstRow(selected.firstRow());
                    excelSelectedResolve.setLastRow(selected.lastRow());
                    if (property != null && property.index() >= 0){
                        selectedMap.put(property.index(), excelSelectedResolve);
                    } else {
                        selectedMap.put(i, excelSelectedResolve);
                    }
                }
            }
        }

        return selectedMap;
    }


}
2、SpringContextUtil.java
@Component
public class SpringContextUtil implements ApplicationContextAware {

    /**
     * 获取ApplicationContext
     */
    @Getter
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    /**
     * 通过class获取Bean
     */
    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }

    /**
     * 通过name以及class获取Bean
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return applicationContext.getBean(name, clazz);
    }
}
五、转换器
1、WhProjectExcelConverter.java

项目id与项目名称互相转化

public class WhProjectExcelConverter implements Converter<String> {

    private final WhProjectService whProjectService = SpringContextUtil.getBean(WhProjectService.class);
    private final List<WhProject> list = whProjectService.list();

    @Override
    public Class<?> supportJavaTypeKey() {
        //实体类对象属性类型
        return String.class;
    }


    /**
     * 将单元格中数据转化为java对象属性
     * @param context
     * @return
     * @throws Exception
     */
    @Override
    public String convertToJavaData(ReadConverterContext<?> context) throws Exception {
        //创建集合用于存储项目id和名称对应关系
        Map<String,String> mapToJavaData = new HashMap<>();
        //遍历项目列表将项目id和名称放入map
        for (WhProject sysDeptEntity : list) {
            mapToJavaData.put(sysDeptEntity.getProjectName(),sysDeptEntity.getId());
        }
        //从cellData中读取数据 转换为实体类中的对象数值
        return mapToJavaData.get(context.getReadCellData().getStringValue());
    }

    /**
     * 将java对象转化为excel单元格数据
     * @param context
     * @return
     * @throws Exception
     */
    @Override
    public WriteCellData<?> convertToExcelData(WriteConverterContext<String> context) throws Exception {
        Map<String,String> mapToExcelData = new HashMap<>();
        for (WhProject sysDeptEntity : list) {
            mapToExcelData.put(sysDeptEntity.getId(),sysDeptEntity.getProjectName());
        }
        //将java属性转换为excel对应属性类型
        return new WriteCellData<>(mapToExcelData.get(context.getValue()));
    }
}
2、WhWorkTypeExcelConverter.java

int类型type值与String类型type名称相互转化

public class WhWorkTypeExcelConverter implements Converter<Integer> {
    private final WhDictItemService whDictItemService = SpringContextUtil.getBean(WhDictItemService.class);
    private final List<WhDictItem> list = whDictItemService.listByCode(WORK_TYPE);

    @Override
    public Class<?> supportJavaTypeKey() {
        //实体类对象属性类型
        return Integer.class;
    }


    /**
     * 将单元格中数据转化为java对象属性
     * @param context
     * @return
     * @throws Exception
     */
    @Override
    public Integer convertToJavaData(ReadConverterContext<?> context) throws Exception {
        //创建集合用于存储部门id和名称对应关系
        Map<String,String> mapToJavaData = new HashMap<>();
        //遍历数据字典将属性名称和属性值放入map
        for (WhDictItem sysDeptEntity : list) {
            mapToJavaData.put(sysDeptEntity.getItemName(),sysDeptEntity.getItemValue());
        }
        //从cellData中读取数据 转换为实体类中的对象数值
        return Integer.valueOf(mapToJavaData.get(context.getReadCellData().getStringValue()));
    }

    /**
     * 将java对象转化为excel单元格数据
     * @param context
     * @return
     * @throws Exception
     */
    @Override
    public WriteCellData<?> convertToExcelData(WriteConverterContext<Integer> context) throws Exception {
        Map<String,String> mapToExcelData = new HashMap<>();
        for (WhDictItem sysDeptEntity : list) {
            mapToExcelData.put(sysDeptEntity.getItemValue(),sysDeptEntity.getItemName());
        }
        //将java属性转换为excel对应属性类型
        return new WriteCellData<>(mapToExcelData.get(context.getValue()));
    }
}
六、Handler类
1、SelectedSheetWriteHandler.java

设置下拉列表相关

@Data
public class SelectedSheetWriteHandler implements SheetWriteHandler {

    /**
     * 构建下拉选的map
     */
    private final Map<Integer, WhExcelSelectedResolve> selectedMap;

    private final int columnSelectMaxLength = 255;


    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        // 这里可以对cell进行任何操作
        Sheet sheet = writeSheetHolder.getSheet();
        DataValidationHelper helper = sheet.getDataValidationHelper();
        selectedMap.forEach((k, v) -> {
            // 设置下拉列表的行: 首行,末行,首列,末列
            CellRangeAddressList rangeList = new CellRangeAddressList(v.getFirstRow(), v.getLastRow(), k, k);
            // 设置下拉列表的值
            DataValidationConstraint constraint = helper.createExplicitListConstraint(v.getSource());
            // 设置约束
            DataValidation validation = helper.createValidation(constraint, rangeList);
            // 阻止输入非下拉选项的值
            validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
            validation.setShowErrorBox(true);
            validation.setSuppressDropDownArrow(true);
            validation.createErrorBox("提示", "请输入下拉选项中的内容");
            sheet.addValidationData(validation);
        });
    }
}
2、CustomSheetWriteHandler.java

设置文本格式、表格式

public class CustomSheetWriteHandler implements SheetWriteHandler {

    // 设置100列column
    private static final Integer COLUMN = 100;

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        // 获取带有 @TextColumn 注解的列索引
        Map<Integer, String> textColumns = getTextColumns();

        SXSSFSheet sxssfSheet = (SXSSFSheet) writeSheetHolder.getSheet();
        for (int i = 0; i < COLUMN; i++) {
            if (textColumns.containsKey(i)) {
                // 设置为文本格式
                CellStyle cellStyle = writeWorkbookHolder.getCachedWorkbook().createCellStyle();
                // 49为文本格式
                cellStyle.setDataFormat((short) 49);
                // i为列,一整列设置为文本格式
                sxssfSheet.setDefaultColumnStyle(i, cellStyle);
            }
        }
    }

    private Map<Integer, String> getTextColumns() {
        Map<Integer, String> textColumns = new HashMap<>();

        Class<?> dataClass = WhProjectPeopleVO.class;
        Field[] fields = dataClass.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(TextColumn.class)) {
                int columnIndex = field.getAnnotation(TextColumn.class).index();
                textColumns.put(columnIndex, field.getName());
            }
        }
        return textColumns;
    }
}
七、SelectedResolve类
@Data
@Slf4j
public class WhExcelSelectedResolve {

    /**
     * 下拉内容
     */
    private String[] source;

    /**
     * 设置下拉框的起始行,默认为第二行
     */
    private int firstRow;

    /**
     * 设置下拉框的结束行,默认为最后一行
     */
    private int lastRow;

    public String[] resolveSelectedSource(ExcelSelected excelSelected) {
        if (excelSelected == null) {
            return null;
        }

        // 获取固定下拉框的内容
        String[] source = excelSelected.source();
        if (source.length > 0) {
            return source;
        }

        // 获取动态下拉框的内容
        Class<? extends WhExcelDynamicSelect>[] classes = excelSelected.sourceClass();
        if (classes.length > 0) {
            try {
                WhExcelDynamicSelect excelDynamicSelect = classes[0].newInstance();
                String[] dynamicSelectSource = excelDynamicSelect.getSource();
                if (dynamicSelectSource != null && dynamicSelectSource.length > 0) {
                    return dynamicSelectSource;
                }
            } catch (InstantiationException | IllegalAccessException e) {
                log.error("解析动态下拉框数据异常", e);
            }

        }
        return null;
    }
}
八、实体类
@Data
@Schema(description = "项目随行人员表")
@HeadRowHeight(30)
@ContentRowHeight(18)
public class WhProjectPeopleVO {

    @ExcelIgnore
    @Schema(description = "id")
    private String id;

    @ExcelIgnore
    @Schema(description = "人员类型 0随行人员1负责人 默认0")
    private Integer type;

    @ExcelProperty(value = "姓名", index = 0)
    @Schema(description = "姓名")
    private String name;


    @ColumnWidth(20)
    @TextColumn(index = 1)
    @ExcelProperty(value = "身份证号", index = 1)
    @Schema(description = "身份证号")
    private String identityId;

    @ColumnWidth(20)
    @ExcelProperty(value = "手机号", index = 2)
    @Schema(description = "手机号")
    private String mobile;


    @ColumnWidth(20)
    @ExcelSelected(sourceClass = WhProjectSelect.class)
    @ExcelProperty(value = "所属项目", index = 3, converter = WhProjectExcelConverter.class)
    @Schema(description = "项目id")
    private String projectId;

    @ExcelIgnore
    @Schema(description = "微信openId")
    private String openId;

    @ExcelIgnore
    @Schema(description = "微信unionId")
    private String unionId;

    @ExcelIgnore
    @Schema(description = "开始时间")
    private Date startTime;

    @ExcelIgnore
    @Schema(description = "结束时间")
    private Date endTime;

    @ExcelIgnore
    @Schema(description = "项目名称")
    private String projectName;

    @ExcelIgnore
    @Schema(description = "最近入场时间")
    private Date lastArrivalTime;

    @ExcelSelected(sourceClass = WhWorkTypeSelect.class)
    @ExcelProperty(value = "工种", index = 4, converter = WhWorkTypeExcelConverter.class)
    @Schema(description = "工种")
    private Integer workType;
}

测试结果

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Fetch处理大模型流式数据请求与解析

为什么有的大模型可以一次返回多个 data&#xff1f; Server-Sent Events (SSE)&#xff1a;允许服务器连续发送多个 data: 行&#xff0c;每个代表一个独立的数据块。 流式响应&#xff1a;大模型服务通常以流式响应方式返回数据&#xff0c;提高响应速度。 批量处理&#x…

开源低代码平台-Microi吾码-一键安装使用(CentOS一键安装MySql+Redis+MinIO+MongoDB+Watchtower脚本)

开源低代码平台-Microi吾码-一键安装使用 前言CentOS7一键安装脚本注意事项&#xff1a;安装成功预览图安装过程图安装结果docker脚本代码【有点东西&#xff1a;&#xff09;】踩过的坑开源低代码平台Microi吾码-系列文档 前言 有小伙伴提出他并不想在本地编译代码、打包镜像、…

Ubuntu 24.04 LTS 解决网络连接问题

1. 问题描述 现象&#xff1a;ens33 网络接口无法获取 IPv4 地址&#xff0c;导致网络不可用。初步排查&#xff1a; 运行 ip a&#xff0c;发现 ens33 接口没有分配 IPv4 地址。运行 ping www.baidu.com&#xff0c;提示“网络不可达”。查看 NetworkManager 日志&#xff0c…

Docker--Docker Container(容器) 之 操作实例

容器的基本操作 容器的操作步骤其实很简单&#xff0c;根据拉取的镜像&#xff0c;进行启动&#xff0c;后可以查看容器&#xff0c;不用时停止容器&#xff0c;删除容器。 下面简单演示操作步骤 1.创建并运行容器 例如&#xff0c;创建一个名为"my-nginx"的交互…

大模型WebUI:Gradio全解系列8——Additional Features:补充特性(上)

大模型WebUI&#xff1a;Gradio全解系列8——Additional Features&#xff1a;补充特性&#xff08;上&#xff09; 前言本篇摘要8. Additional Features&#xff1a;补充特性8.1 队列8.1.1 使用方法8.1.2 配置队列演示 8.2 输入输出流8.2.1 输出流1. 生成器yield2. 流媒体 8.2…

leetcode 2658. 网格图中鱼的最大数目

题目如下 数据范围 使用并查集来做这道题。 其实按照题目的意思就是让我们求每一个联通的水域可以捞到的最大权值。 我们可以从前往后遍历这个二维数组只需要判断前一个水域和上一个水域是否和当前的(i, j)联通如果有则合并水域&#xff0c;同时用一个weight数组保存每一个联…

【go每日一题】golang异常、错误 {源码、实践、总结}

错误与异常在golang中区分 Go 的错误处理设计与其他语言的异常不同。Go 中的 error 就是一个普通的值对象&#xff0c;而其他语言如 Java 中的 Exception 将会造成程序控制流的终止和其他行为&#xff0c;Exception 与普通的值不同。虽然 Go 也有类似的异常机制 —— panic&am…

大模型 Fine-Tuning 技术解析

引言 在大型语言模型&#xff08;LLMs, Large Language Models&#xff09;的发展历程中&#xff0c;预训练模型和微调&#xff08;Fine-tuning&#xff09;技术起到了至关重要的作用。这些技术使得模型不仅能够学习到丰富的语言特征&#xff0c;还能根据具体任务进行优化调整…

LabVIEW开发中常见硬件通讯接口快速识别

在 LabVIEW 开发中&#xff0c;与硬件进行通讯是实现数据采集与控制的重要环节。准确判断通讯接口类型和协议&#xff0c;可以提高开发效率&#xff0c;减少调试时间。本文结合 LabVIEW 的实际应用&#xff0c;详细介绍如何识别和判断常见硬件通讯接口的定义&#xff0c;并提供…

抖音短视频矩阵系统源码开发全流程解析

在项目开发过程中&#xff0c;调整配置文件至关重要&#xff0c;这些文件包括数据库连接、API密钥及全局参数等。通过正确配置这些信息&#xff0c;可确保应用程序的稳定性和安全性。灵活调整配置以适应具体需求有助于短视频矩阵系统项目的顺利推进。 在开发环境中&#xff0c…

Unity功能模块一对话系统(4)实现个性文本标签

本期我们将了解如何在TMPro中自定义我们的标签样式&#xff0c;并实现两种有趣的效果。 一.需求描述 1.定义<float>格式的标签&#xff0c;实现标签处延迟打印功能 2.定义<r" "></r>格式的标签&#xff0c;实现标签区间内文本片段的注释显示功能…

深度学习实战自动驾驶目标识别

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对BDD100K自动驾驶目标数据集进行训练和优化&#xff0c;该数据集包含丰富的自动驾…

广西大数据局:数聚政府、利企惠民(广西数字政府建设内容、管理机制、应用场景)

2023年数字政府评估大会上&#xff0c;广西大数据局党委书记、主任周飞发表了题为“数聚政府、利企惠民”的主旨演讲。主要介绍了广西壮族自治区“数字政府的建设内容、数字政府的管理机制以及数字政府有哪些应用场景来实现惠企利民”。 篇幅限制&#xff0c;部分内容如下&…

AI 助力游戏开发中的常用算法实现

在当今的游戏开发领域&#xff0c;人工智能&#xff08;AI&#xff09;技术的应用已经成为推动行业发展的关键力量。AI不仅能够提升游戏的智能化水平&#xff0c;还能够增强玩家的沉浸感和游戏体验。随着技术的进步&#xff0c;AI在游戏设计、开发和测试中的应用越来越广泛&…

行业商机信息付费小程序系统开发方案

行业商机信息付费小程序系统&#xff0c;主要是整合优质行业资源&#xff0c;实时更新的商机信息。在当今信息爆炸的时代&#xff0c;精准、高效地获取行业商机信息对于企业和个人创业者而言至关重要。 一、使用场景 日常浏览&#xff1a;用户在工作间隙或闲暇时间&#xff0c…

LabVIEW 中 NI Vision 模块的IMAQ Create VI

IMAQ Create VI 是 LabVIEW 中 NI Vision 模块&#xff08;NI Vision Development Module&#xff09;的一个常用 VI&#xff0c;用于创建一个图像变量。该图像变量可以存储和操作图像数据&#xff0c;是图像处理任务的基础。 ​ 通过以上操作&#xff0c;IMAQ Create VI 是构建…

[AI] 深度学习的“黑箱”探索:从解释性到透明性

目录 1. 深度学习的“黑箱”问题&#xff1a;何为不可解释&#xff1f; 1.1 为什么“黑箱”问题存在&#xff1f; 2. 可解释性研究的现状 2.1 模型解释的方法 2.1.1 后置可解释性方法&#xff08;Post-hoc Explanations&#xff09; 2.1.2 内在可解释性方法&#xff08;I…

UnityRenderStreaming使用记录(四)

测试把UnityRenderStreaming部署在docker&#xff0c;剧透一下&#xff0c;嘎了…… 当然webserver运行的妥妥的 那么打包出的程序运行log Mono path[0] /home/unity/Broadcast/Broadcast_Data/Managed Mono config path /home/unity/Broadcast/Broadcast_Data/MonoBleedingE…

javaEE-文件操作和IO-文件

目录 一.什么是文件 1.文件就是硬盘(磁盘)上的文件。 2.计算机中存储数据的设备&#xff1a; 3.硬盘的物理特征 4.树型结构组织和⽬录 5.文件路径 文件路径有两种表示方式&#xff1a; 6.文件的分类 二、java中文件系统的操作 1.File类中的属性&#xff1a; 2.构造方…

SqlSession的线程安全问题源码分析

&#x1f3ae; 作者主页&#xff1a;点击 &#x1f381; 完整专栏和代码&#xff1a;点击 &#x1f3e1; 博客主页&#xff1a;点击 文章目录 SqlSession 是线程安全的吗&#xff1f;为什么说是线程不安全的&#xff1f;事务管理问题 数据库连接的共享问题 一级缓存线程安全问题…