【Java编程系列】Mybatis的Interceptor注入yml自定义变量,多种实现方式

news2024/9/25 17:13:32

1、前言

        当前有一个任务,需要将mybatis的sql进行拦截过滤处理,而拦截处理时,需要有一些白名单放行的配置方法名路径。所以,这里使用到了yml的配置文件来配置变量路径,而后引入拦截器做动态放行。


2、注入自定义变量方式

2.1 通过@Value注解引入

        首先在yml文件中定义自己需要放行的方法名或路径,例如:

         在拦截器配置类AbstractConfig 中,引入该变量,使用如下方式:

@Value("#{'${testUrl}'.split(',')}")
public List<String> list;

        在设置拦截器时,将上述变量,通过setProperties()方法,设置进拦截器中,如:

package ***.config;


import javax.sql.DataSource;
import java.util.List;
import java.util.Properties;


@Slf4j
public abstract class AbstractConfig {
	
    @Value("#{'${testUrl}'.split(',')}")
    public List<String> list;
	

	public Interceptor[] setPlugins() {
        //你的拦截器
    	MyInterceptor s = new MyInterceptor();
    	Properties p = new Properties();
    	p.put("list",list);
    	s.setProperties(p);
    	
		return new Interceptor[]{
				s
		};
	}

    
	@Bean(name = "testSqlSessionFactory")
    @Primary
	public SqlSessionFactory setSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource, ResourceLoader resourceLoader, ObjectProvider<TypeHandler[]> typeHandlersProvider) throws Exception {
		MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        //此处删除了很多无关代码............
        factory.setPlugins(setPlugins());
        return factory.getObject();
    }    
}

        然后在自己的拦截器MyInterceptor 中的setProperties(Properties properties)方法中,就能获取到对应的yml自定义变量值啦

这里贴一下拦截器的大概构造吧:

import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;

@Slf4j
@Component
public class MyInterceptor implements Interceptor {

	@Override
	public Object intercept(Invocation invocation) throws Throwable{
        
		return invocation.proceed();
	}
	

	@Override
	public Object plugin(Object target) {
		log.info("MyInterceptor plugin:{}", target);
        return Plugin.wrap(target, this);
	}

	@Override
	public void setProperties(Properties properties) {
		log.info("MyInterceptor setProperties:{}", properties);
	}
}

2.2 通过@ConfigurationProperties结合@Autowired的对象引入

         

        先创建自定义变量配置类TestProperties ,如:

@Data
@ConfigurationProperties(prefix = "test")
@Configuration
public class TestProperties {
	
	private List<String> exceptUrls ;
	
}

        还是在拦截器配置类AbstractConfig 中,通过@Autowired引入配置类:

package ***.config;


import javax.sql.DataSource;
import java.util.List;
import java.util.Properties;


@Slf4j
public abstract class AbstractConfig {
	
    @Autowired
    private TestProperties testProperties;
	

	public Interceptor[] setPlugins() {
        //你的拦截器
    	MyInterceptor s = new MyInterceptor(testProperties);
    	
		return new Interceptor[]{
				s
		};
	}

    
	@Bean(name = "testSqlSessionFactory")
    @Primary
	public SqlSessionFactory setSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource, ResourceLoader resourceLoader, ObjectProvider<TypeHandler[]> typeHandlersProvider) throws Exception {
		MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        //此处删除了很多无关代码............
        factory.setPlugins(setPlugins());
        return factory.getObject();
    }    
}

        此时,需要拦截器类MyInterceptor中,通过构建函数,获取注入的自定义变量:

import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;

@Slf4j
@Component
public class MyInterceptor implements Interceptor {
    

    private final List<String> exceptUrls;
    
    //此处就是通过构造函数注入的配置对象,从而获取到自定义的变量属性
    public MyInterceptor (TestProperties testProperties) {
	    this.exceptUrls = testProperties.getExceptUrls();
    }

	@Override
	public Object intercept(Invocation invocation) throws Throwable{
        
		return invocation.proceed();
	}
	

	@Override
	public Object plugin(Object target) {
		log.info("MyInterceptor plugin:{}", target);
        return Plugin.wrap(target, this);
	}

	@Override
	public void setProperties(Properties properties) {
		log.info("MyInterceptor setProperties:{}", properties);
	}
}

效果如下:


3、总结

        第一种方式,有一个小问题,目前没能处理成功。就是在拦截器配置类AbstractConfig 中使用@Value获取list类型的yml自定义数据。例如,直接用:

@Value("${test.exceptUrls}")
public List<String> list;

        这样获取到的自定义值list一直都是null,这里目前还有点没明白,为啥获取不到值??

        有知道的朋友,欢迎留言讨论~~~~

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

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

相关文章

5点起床,一直干到11点的外卖小哥转行程序员,入职起薪12K

“我是要成为卷王的男人”是95后的小魏的座右铭&#xff0c;曾经的他5点起床&#xff0c;10分钟洗漱完毕就开始了一天的工作—送外卖。是的&#xff0c;曾经的他是万千外卖小哥的其中一员。 19年毕业的小魏学的是土木工程&#xff0c;曾经他也在工地待过&#xff0c;风尘仆仆却…

教程!!!!!

使用门槛&#xff1a;需要自行准备能开全局代理的科学工具 好评赠送免费科学工具&#xff0c;也可以自己准备科学工具。 下单以后&#xff0c;我们会发送一串账号密码给您。如图&#xff1a; 其中卡号就是chatgpt的账号&#xff0c;密码就是chatgpt密码。 第一步&#xff1…

星火计划学习笔记——第八讲Apollo控制模块解析与实践1

文章目录1. 控制理论简介1.1 控制的作用1.2 自动驾驶控制的目标1.3自动驾驶控制器的设计2. 汽车运动学与动力学2.1 常用的自动驾驶控制算法2.2 车辆运动学模型 Kinematics2.3 车辆动力学模型 Dynamics3. Apollo控制模块3.1 Apollo控制模块3.2 规划与控制相配合3.3 Apollo控制模…

零基础学习编程,选择什么编程语言比较合适?

随着互联网的兴起&#xff0c;越来越多的人想要学习编程&#xff0c;却不知道该从哪开始学&#xff0c;小编就通过以下几点给大家分析一下&#xff0c;零基础入门学习编程&#xff0c;该如何选择编程语言。 1、哪一门语言容易入门&#xff01; 所有语言的知识体系分为三大块&…

SAP ABAP 物料主数据的视图维护状态

SAP ABAP 物料主数据的视图维护状态 引言&#xff1a; 物料主数据的视图维护状态会经常使用&#xff0c;是物料主数据批量创建/修改的逻辑路由。 关键字&#xff1a;SAP ABAP VPSTA PSTAT T132T 文章目录SAP ABAP 物料主数据的视图维护状态1. 技术说明2. 维护状态3. 维护记录…

Linux——实用指令

帮助指令 man 获得帮助信息 基本语法 man [命令或配置文件] 注意&#xff1a;命令可以组合使用&#xff0c;比如ls -al&#xff0c;ls -la help 获得shell内置命令的帮助信息 基本语法 help命令 时间日期类 date指令 显示当前日期 基本语法 date&#xff08;显示…

【细胞分割】原子力显微镜图像分析【含GUI Matlab源码 1371期】

⛄一、AFM简介 理论知识参考文献&#xff1a;原子力显微镜&#xff08;AFM&#xff09;图像的计算机辅助分析 ⛄二、部分源代码 function varargout AFManalysis(varargin) % AFMANALYSIS M-file for AFManalysis.fig % AFMANALYSIS, by itself, creates a new AFMANALYSIS…

【图像处理】高效斑点特征提取技术研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

10年经验Python老司机分享:转行如何自学Python并且找到工作?

目前信息化产业发展势头很好&#xff0c;互联网就成为了很多普通人想要涉及的行业&#xff0c;因为相比于传统行业&#xff0c;互联网行业涨薪幅度大&#xff0c;机会也多&#xff0c;所以就会大批的人想要转行来学习Python开发。 零基础学习Python必须明确的几点&#xff1a; …

5个千兆网口,将有什么样高速网络传输体验?——米尔MYD-J1028X开发板实测分享

本篇测评由电子工程世界的优秀测评者“HonestQiao ”提供。 此次的板卡测试&#xff0c;是米尔MYD-J1028X开发板的高速网络数据传输测试体验。 01 本次测试的主角 米尔MYD-J1028X开发板提供了5个超级给力的最高支持千兆网络接口&#xff0c;具体如下&#xff1a; 通过查看官…

基于AD936X+Intel FPGA的射频方案

基于ADI AD936X和Intel Cyclone V FPGA的射频方案&#xff0c;适合于无线通信基础设施、防务电子系统、RF测试设备和仪器以及通用软件定义无线电平台等应用。 关于ADI AD936X系列射频收发器 AD936X系列的工作频率范围覆盖从70 MHz到6 GHz。它是一系列完整的无线电设计&#x…

底层网络知识详解:最重要的传输层-第11讲-TCP协议(上):因性恶而复杂,先恶后善反轻松

上一节,我们讲的UDP,基本上包括了传输层所必须的端口字段。它就像我们小时候一样简单,相信“网之初,性本善,不丢包,不乱序”。 后来呢,我们都慢慢长大,了解了社会的残酷,变得复杂而成熟,就像TCP协议一样。它之所以这么复杂,那是因为它秉承的是“性恶论”。它天然认…

Dubbo 4 Dubbo 高级特性 4.2 Dubbo 常用高级配置 4.2.7 集群容错 4.2.8 服务降级

Dubbo 【黑马程序员Dubbo快速入门&#xff0c;Java分布式框架dubbo教程】 4 Dubbo 高级特性 文章目录Dubbo4 Dubbo 高级特性4.2 Dubbo 常用高级配置4.2.7 集群容错4.2.8 服务降级4.2 Dubbo 常用高级配置 4.2.7 集群容错 【一个场景】 现在 服务 提供者 部署成 了一个集群&a…

痞子衡嵌入式:我被邀请做科锐国际旗下数科同道主办的技术沙龙嘉宾

「数科同道」是「科锐国际」旗下的面向技术开发者的专属垂直招聘平台。《数科同道技术沙龙》是由数科同道主办的活动&#xff0c;每期活动邀请行业内及其他知名公司的技术专家分享来自一线的实践经验。自2022年12月起&#xff0c;数科同道将在苏州&#xff0c;聚焦嵌入式行业及…

【Cadence Virtuoso】IC617 入门操作 (MOS特性分析)

Cadence Virtuoso IC617 入门操作篇前言一、软件操作&#xff08;1&#xff09;创建自己的Library&#xff08;2&#xff09;创建Library下的 Cell二、电路搭建&#xff08;1&#xff09;调出器件三、电路仿真&#xff08;1&#xff09;打开仿真工具“ADE L”(2) 对参数进行赋值…

【MATLAB教程案例63】学习如何建立自己的深度学习训练样本库,包括分类识别数据库和目标检测数据库

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.建立自己的深度学习训练样本库1——分类识别数据库

纯精华、二十八道BATJ大厂Java岗之“多线程与并发“面试题分享

年底了&#xff0c;又到了跳槽季啦&#xff0c;该刷题走起了。这里总结了一些被问到可能会懵逼的面试真题&#xff0c;有需要的可以看下&#xff5e; 一、进程与线程 进程是资源分配的最小单位&#xff0c;线程是cpu调度的最小单位。线程也被称为轻量级进程。 所有与进程相关…

内存读写指令 —— LDR / STR

CPU在处理C语言的 a 操作时&#xff0c;变量a因为是放在在内存里的&#xff0c;需要先把a从内存中读取到寄存器中&#xff0c;运算完毕后再保存到内存中。 因此&#xff0c;这个过程中肯定需要用到内存的读写指令。 目录 1、基本内存读写指令&#xff08;4个字节读写&#xf…

路由声明式传参和编程式传参

声明式传参(使用带href /或本质上是a标签的时候) 直接带路径里带携带参数 下例 在地址栏是可以看到参数的&#xff08;querys传参&#xff09; 在vue.tools插件里可以观察到 取出路径参数的方式 params传参 首先需要在路由规则里配置 下图&#xff08;复制这行路由规则&am…

Day43——Dp专题

文章目录股票问题篇21、买卖股票的最佳时机22、买卖股票的最佳时机II23、买卖股票的最佳时机Ⅲ24、买卖股票的最佳时机Ⅳ25、最佳买卖股票时机含冷冻期26、买卖股票的最佳时机含手续费股票问题总结篇股票问题篇 21、买卖股票的最佳时机 力扣题目链接 动态规划 定义二维数组…