利用mybatis的拦截器,拦截其他的方法
在上一篇中我知道拦截器的入口在InterceptorChain中的putAll,
由putAll方法生成对象的代理,由代理的对象执行对象的方法。
因此只要得到InterceptorChain对象,则一切就可以解决了。
Configuration没有提供interceptorChain属性的get方法。
因此需要修改源码,为interceptorChain属性添加get方法。
修改源码
方法由两种
1. 直接下载源码修改后编译
2. 在本地的项目中键包org.apache.ibatis.session
,然后在包下面建类
Configuration,把原来Configuration
类中的内容复制过去,在修改,
当本地有和源码中有相同的类名切具有相同的包的时候,优先加载本地的
具体实现
Configuration类
package org.apache.ibatis.session;
/**
* @author Clinton Begin
*/
public class Configuration {
protected final MapperRegistry mapperRegistry = new MapperRegistry(this);
protected final InterceptorChain interceptorChain = new InterceptorChain();
protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();
protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();
protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");
protected final Map<String, Cache> caches = new StrictMap<Cache>("Caches collection");
protected final Map<String, ResultMap> resultMaps = new StrictMap<ResultMap>("Result Maps collection");
protected final Map<String, ParameterMap> parameterMaps = new StrictMap<ParameterMap>("Parameter Maps collection");
protected final Map<String, KeyGenerator> keyGenerators = new StrictMap<KeyGenerator>("Key Generators collection");
protected final Set<String> loadedResources = new HashSet<String>();
protected final Map<String, XNode> sqlFragments = new StrictMap<XNode>("XML fragments parsed from previous mappers");
protected final Collection<XMLStatementBuilder> incompleteStatements = new LinkedList<XMLStatementBuilder>();
protected final Collection<CacheRefResolver> incompleteCacheRefs = new LinkedList<CacheRefResolver>();
protected final Collection<ResultMapResolver> incompleteResultMaps = new LinkedList<ResultMapResolver>();
protected final Collection<MethodResolver> incompleteMethods = new LinkedList<MethodResolver>();
/*
* A map holds cache-ref relationship. The key is the namespace that
* references a cache bound to another namespace and the value is the
* namespace which the actual cache is bound to.
*/
protected final Map<String, String> cacheRefMap = new HashMap<String, String>();
protected Environment environment;
//setting的配置
/**
* 1.该配置影响的所有映射器中配置的缓存的全局开关。
*/
protected boolean cacheEnabled = true;
/**
* 2.延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。
*/
protected boolean lazyLoadingEnabled = false;
/**
* 3.当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载。默认false
*/
protected boolean aggressiveLazyLoading;
/**
* 4. 是否允许单一语句返回多结果集(需要兼容驱动)。
*/
protected boolean multipleResultSetsEnabled = true;
/**
* 5.使用列标签代替列名。不同的驱动在这方面会有不同的表现
*/
protected boolean useColumnLabel = true;
/**
* 6.允许 JDBC 支持自动生成主键,需要驱动兼容
*/
protected boolean useGeneratedKeys;
/**
* 7.指定 MyBatis 应如何自动映射列到字段或属性。
* NONE 表示取消自动映射;
* PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。(意思就是映射文件中,对于resultMap标签,如果没有显式定义result标签,
* mybatis不会帮你把结果映射到model(pojo)上.除了id属性有具体值外,其余都没有)
* FULL 会自动映射任意复杂的结果集(无论是否嵌套)。
*/
protected AutoMappingBehavior autoMappingBehavior = AutoMappingBehavior.PARTIAL;
/**
* 8.指定发现自动映射目标未知列(或者未知属性类型)的行为。
* NONE: 不做任何反应
* WARNING: 输出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等级必须设置为 WARN)
* FAILING: 映射失败 (抛出 SqlSessionException)
*/
protected AutoMappingUnknownColumnBehavior autoMappingUnknownColumnBehavior = AutoMappingUnknownColumnBehavior.NONE;
/**
* 9. 配置默认的执行器。
* SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements);
* BATCH 执行器将重用语句并执行批量更新。
*/
protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;
/**
* 10.设置超时时间,它决定驱动等待数据库响应的秒数。
*/
protected Integer defaultStatementTimeout;
/**
* 11.果集获取数量(fetchSize)设置一个提示值,此参数只可以在查询设置中被覆盖。
*/
protected Integer defaultFetchSize;
/**
* 12. 允许在嵌套语句中使用分页(RowBounds)。 If allow, set the false.
*/
protected boolean safeRowBoundsEnabled;
/**
* 13.允许在嵌套语句中使用分页(ResultHandler)。 If allow, set the false.
*/
protected boolean safeResultHandlerEnabled = true;
/**
* 14.是否开启自动驼峰命名规则(camel case)映射
*/
protected boolean mapUnderscoreToCamelCase;
/**
* 15. MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。
* 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。
* 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。
*/
protected LocalCacheScope localCacheScope = LocalCacheScope.SESSION;
/**
* 16.当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型
*/
protected JdbcType jdbcTypeForNull = JdbcType.OTHER;
/**
* 17. 指定哪个对象的方法触发一次延迟加载。
*/
protected Set<String> lazyLoadTriggerMethods = new HashSet<String>(Arrays.asList(new String[]{
"equals", "clone", "hashCode", "toString"}));
/**
* 18. 指定动态 SQL 生成的默认语言。
*/
protected final LanguageDriverRegistry languageRegistry = new LanguageDriverRegistry();
/**
* 19. 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,
* 这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。
* 注意基本类型(int、boolean等)是不能设置成 null 的。
*/
protected boolean callSettersOnNulls;
/**
* 20. 当返回行的所有列都是空时,MyBatis默认返回null。
* 当开启这个设置时,MyBatis会返回一个空实例。
* 它也适用于嵌套的结果集 (i.e. collectioin and association)。(从3.4.2开始)
*/
protected boolean returnInstanceForEmptyRow;
/**
* 21.指定 MyBatis 增加到日志名称的前缀。
*/
protected String logPrefix;
/**
* 22.指定 MyBatis 所用日志的具体实现,未指定时将自动查找。
*/
protected Class<? extends Log> logImpl;
/**
* 23. 指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。默认JAVASSIST
* CGLIB | JAVASSIST
*/
protected ProxyFactory proxyFactory = new JavassistProxyFactory(); // #224 Using internal Javassist instead of OGNL
/**
* 24.指定VFS的实现(虚拟文件系统)
*/
protected Class<? extends VFS> vfsImpl;
/**
* 25.允许使用方法签名中的名称作为语句参数名称。
* 为了使用该特性,你的工程必须采用Java 8编译,并且加上-parameters选项。(从3.4.1开始)
*/
protected boolean useActualParamName = true;
/**26.
* Configuration factory class.
* Used to create Configuration for loading deserialized unread properties.
*
* @see <a href='https://code.google.com/p/mybatis/issues/detail?id=300'>Issue 300 (google code)</a>
*/
protected Class<?> configurationFactory;
protected Properties variables = new Properties();
protected ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
protected ObjectFactory objectFactory = new DefaultObjectFactory();
prote