上级文章:
快速Mybatis拦截器 - Inteceptor:https://blog.csdn.net/qq_28033719/article/details/107939959
因为已经有了一个 Mybatis 拦截器的 Demo ,现在需要自定义一个 Mybatis 的注解,然后使用拦截器对自定义注解进行拦截处理。
变动的类:
需求
因为需要对一些数据源进行拦截处理,所以现在为减少代码侵入,使用注解对 Mybatis 的接口进行单独的拦截是最好的,毕竟 Mybatis 的接口是对应数据源的访问。
同时注解需要增加对 service 的支持,能够除了 Mybatis 的接口后继处理,也能够对 Service 进行业务上的后继处理。
具体代码
DBCheck注解
package org.angular.test.annotation;
import org.angular.test.aspect.DBCheckAspect;
import org.angular.test.support.PhoneDaoSupport;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 对 Mybatis 的接口进行拦截
* 就数据源进行相应的后继处理 (daoSupport)
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.PARAMETER})
public @interface DBCheck {
// 拦截 Mybatis 后的处理方法
String method() default DBCheckAspect.DEFAULT_METHOD_NAME;
// 拦截 Mybatis 后的处理类
Class clazz() default PhoneDaoSupport.class;
}
MybatisDataSourceConf某个代码块
// 增加一个常量, 方便处理多个工厂名
public static final String DEFAULT_FACTORY_NAME = "sqlSessionFactory";
@Bean(name = DEFAULT_FACTORY_NAME)
public SqlSessionFactory test1SqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dynamicDataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setPlugins(new Interceptor[]{angularInterceptor});
bean.setDataSource(dynamicDataSource);
return bean.getObject();
}
AngularMybatisInterceptor
package org.angular.test.interceptor;
import java.lang.reflect.Type;
import java.util.*;
import org.angular.test.aspect.DBCheckAspect;
import org.apache.ibatis.binding.MapperMethod;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap;
@Component
@Intercepts({
@Signature(
method = "query",
type=Executor.class,
args={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),
@Signature(
method = "query",
type=Executor.class,
args={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
public class AngularMybatisInterceptor implements Interceptor {
@Autow