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自定义变量,多种实现方式的主要内容,如果未能解决你的问题,请参考以下文章

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

Java面试——MyBatis系列总结

Java面试——MyBatis系列总结

mybatis拦截器使用

Mybatis系列接口式编程

Mybatis系列接口式编程