Java编程系列Mybatis的Interceptor注入yml自定义变量,多种实现方式
Posted 善良勤劳勇敢而又聪明的老杨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java编程系列Mybatis的Interceptor注入yml自定义变量,多种实现方式相关的知识,希望对你有一定的参考价值。
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,这里目前还有点没明白,为啥获取不到值??
有知道的朋友,欢迎留言讨论~~~~
以上是关于Java编程系列Mybatis的Interceptor注入yml自定义变量,多种实现方式的主要内容,如果未能解决你的问题,请参考以下文章