MyBatis-3.4.2-源码分析4:解析XML之pluginElement(root.evalNode("plugins"))
2017-03-27 00:00
691 查看
下面,开始解析plugins的XML
debug的代码位于
首先关于寻址类的优先级,是可以通过别名来查找的
别名你懂的,如果没有别名,就认为你指定的是一个类,正常初始化这个类
---
很简单,没啥好说的。
pluginElement(root.evalNode("plugins"))
debug的代码位于
stop in org.apache.ibatis.builder.xml.XMLConfigBuilder.pluginElement
首先关于寻址类的优先级,是可以通过别名来查找的
@SuppressWarnings("unchecked") // throws class cast exception as well if types cannot be assigned public <T> Class<T> resolveAlias(String string) { // 看到这里了 try { if (string == null) { return null; } // issue #748 // String key = string.toLowerCase(Locale.ENGLISH); Class<T> value; //可以是通过别名寻址 if (TYPE_ALIASES.containsKey(key)) { value = (Class<T>) TYPE_ALIASES.get(key); } else { //否则正常初始化类 value = (Class<T>) Resources.classForName(string); } //返回结果 return value; //结束 } catch (ClassNotFoundException e) { throw new TypeException("Could not resolve type alias '" + string + "'. Cause: " + e, e); } }
别名你懂的,如果没有别名,就认为你指定的是一个类,正常初始化这个类
---
private void pluginElement(XNode parent) throws Exception { // 如果定义了plugin节点 if (parent != null) { //遍历每1个子节点 for (XNode child : parent.getChildren()) { //获取interceptor的值 String interceptor = child.getStringAttribute("interceptor"); //其它子节点作为属性存在 Properties properties = child.getChildrenAsProperties(); //指定的interceptor实例化,所以传递的这个类必须实现Interceptor接口 Interceptor interceptorInstance = (Interceptor) resolveClass(interceptor).newInstance(); //属性设置,自己实现 interceptorInstance.setProperties(properties); //非常重要 configuration.addInterceptor(interceptorInstance); //看到这里了 } } }
public class InterceptorChain { private final List<Interceptor> interceptors = new ArrayList<Interceptor>(); public Object pluginAll(Object target) { for (Interceptor interceptor : interceptors) { target = interceptor.plugin(target); } return target; } public void addInterceptor(Interceptor interceptor) { // 有序依次添加 interceptors.add(interceptor); }
很简单,没啥好说的。
相关文章推荐
- MyBatis-3.4.2-源码分析9:XML解析之databaseIdProviderElement(root.evalNode("databaseIdProvider"))
- MyBatis-3.4.2-源码分析1:解析XML之propertiesElement(root.evalNode("properties"))
- MyBatis-3.4.2-源码分析5:解析XML之objectFactoryElement(root.evalNode("objectFactory"))
- MyBatis-3.4.2-源码分析12:XML解析之mapperElement(root.evalNode("mappers"))
- MyBatis-3.4.2-源码分析8:XML解析之environmentsElement(root.evalNode("environments"))
- MyBatis-3.4.2-源码分析2:解析XML之settingsAsProperties(root.evalNode("settings"))
- MyBatis-3.4.2-源码分析14:XML解析之sqlElement(context.evalNodes("/mapper/sql"))
- MyBatis-3.4.2-源码分析15:XML解析之buildStatementFromContext(context.evalNodes(‘select|insert|update|delete’
- mybatis---源码分析----xml解析----XNode
- MyBatis-3.4.2-源码分析11:XML解析之environmentsElement+Druid的解析准备工作:整合Druid
- MyBatis-3.4.2-源码分析18:XML解析之RoleMapper userMapper = sqlSession.getMapper(RoleMapper.class)
- MyBatis-3.4.2-源码分析7:解析XML之settingsElement(settings)
- MyBatis-3.4.2-源码分析16:XML解析之SqlSessionFactory|SqlSession
- MyBatis-3.4.2-源码分析6:解析XML之objectWrapperFactoryElement & reflectorFactoryElement
- MyBatis-3.4.2-源码分析17:XML解析之bindMapperForNamespace
- mybatis源码学习之执行过程分析(2)——config.xml配置文件和mapper.xml映射文件解析过程
- "/opt/ros/indigo/share/gmapping/nodelet_plugins.xml" which had no Root Element.
- 【MyBatis源码分析】plugins解析属性配置元素详述
- Mybatis3源码分析(三):解析mapper的xml配置文件
- MyBatis-3.4.2-源码分析19:Plugins机制研究-初探