【MyBatis源码分析】加载Xml配置文件
在mybatis源码中找到XmlConfigBuilderTest,以debug模式运行shouldSuccessfullyLoadXMLConfigFile()。 初始化首先创建XMLConfigBuilder对象,在构造方法中:
解析配置接着调用XMLConfigBuilder.parse()解析xml文件:
附录典型的mybatis-config.xml<?xml version="1.0" encoding="UTF-8" ?> <!-- ? Copyright 2009-2016 the original author or authors. ? Licensed under the Apache License,Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at ? http://www.apache.org/licenses/LICENSE-2.0 ? Unless required by applicable law or agreed to in writing,software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied. See the License for the specific language governing permissions and limitations under the License. ? --> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> ? <configuration> ? <properties resource="org/apache/ibatis/databases/blog/blog-derby.properties"/> ? <settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="false"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> </settings> ? <typeAliases> <package name="org.apache.ibatis.domain"/> </typeAliases> <!--<typeAliases>--> <!--<typeAlias alias="Author" type="org.apache.ibatis.domain.blog.Author"/>--> <!--<typeAlias alias="Blog" type="org.apache.ibatis.domain.blog.Blog"/>--> <!--<typeAlias alias="Comment" type="org.apache.ibatis.domain.blog.Comment"/>--> <!--<typeAlias alias="Post" type="org.apache.ibatis.domain.blog.Post"/>--> <!--<typeAlias alias="Section" type="org.apache.ibatis.domain.blog.Section"/>--> <!--<typeAlias alias="Tag" type="org.apache.ibatis.domain.blog.Tag"/>--> <!--</typeAliases>--> <typeHandlers> <typeHandler javaType="String" jdbcType="VARCHAR" handler="org.apache.ibatis.builder.CustomStringTypeHandler"/> </typeHandlers> ? <objectFactory type="org.apache.ibatis.builder.ExampleObjectFactory"> <property name="objectFactoryProperty" value="100"/> </objectFactory> ? <plugins> <plugin interceptor="org.apache.ibatis.builder.ExamplePlugin"> <property name="pluginProperty" value="100"/> </plugin> </plugins> ? <environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="" value=""/> </transactionManager> <dataSource type="UNPOOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> ? <mappers> <mapper resource="org/apache/ibatis/builder/AuthorMapper.xml"/> <mapper resource="org/apache/ibatis/builder/BlogMapper.xml"/> <mapper resource="org/apache/ibatis/builder/CachedAuthorMapper.xml"/> <mapper resource="org/apache/ibatis/builder/PostMapper.xml"/> <mapper resource="org/apache/ibatis/builder/NestedBlogMapper.xml"/> </mappers> ? </configuration> 单元测试方法该方法位于XmlConfigBuilderTest类中: @Test void shouldSuccessfullyLoadXMLConfigFile() throws Exception { // System.setProperty(XPathParser.KEY_USE_XSD,"true"); String resource = "org/apache/ibatis/builder/xsd/CustomizedSettingsMapperConfig.xml"; try (InputStream inputStream = Resources.getResourceAsStream(resource)) { XMLConfigBuilder builder = new XMLConfigBuilder(inputStream); Configuration config = builder.parse(); ? assertEquals(AutoMappingBehavior.NONE,config.getAutoMappingBehavior()); assertEquals(AutoMappingUnknownColumnBehavior.WARNING,config.getAutoMappingUnknownColumnBehavior()); assertFalse(config.isCacheEnabled()); assertTrue(config.getProxyFactory() instanceof CglibProxyFactory); assertTrue(config.isLazyLoadingEnabled()); assertTrue(config.isAggressiveLazyLoading()); assertFalse(config.isMultipleResultSetsEnabled()); assertFalse(config.isUseColumnLabel()); assertTrue(config.isUseGeneratedKeys()); assertEquals(ExecutorType.BATCH,config.getDefaultExecutorType()); assertEquals(Integer.valueOf(10),config.getDefaultStatementTimeout()); assertEquals(Integer.valueOf(100),config.getDefaultFetchSize()); assertTrue(config.isMapUnderscoreToCamelCase()); assertTrue(config.isSafeRowBoundsEnabled()); assertEquals(LocalCacheScope.STATEMENT,config.getLocalCacheScope()); assertEquals(JdbcType.NULL,config.getJdbcTypeForNull()); assertEquals(new HashSet<>(Arrays.asList("equals","clone","hashCode","toString","xxx")),config.getLazyLoadTriggerMethods()); assertFalse(config.isSafeResultHandlerEnabled()); assertTrue(config.getDefaultScriptingLanguageInstance() instanceof RawLanguageDriver); assertTrue(config.isCallSettersOnNulls()); assertEquals("mybatis_",config.getLogPrefix()); assertEquals(Slf4jImpl.class.getName(),config.getLogImpl().getName()); assertEquals(JBoss6VFS.class.getName(),config.getVfsImpl().getName()); assertEquals(String.class.getName(),config.getConfigurationFactory().getName()); ? assertEquals(Author.class,config.getTypeAliasRegistry().getTypeAliases().get("blogauthor")); assertEquals(Blog.class,config.getTypeAliasRegistry().getTypeAliases().get("blog")); assertEquals(Cart.class,config.getTypeAliasRegistry().getTypeAliases().get("cart")); ? assertTrue(config.getTypeHandlerRegistry().getTypeHandler(Integer.class) instanceof CustomIntegerTypeHandler); assertTrue(config.getTypeHandlerRegistry().getTypeHandler(Long.class) instanceof CustomLongTypeHandler); assertTrue(config.getTypeHandlerRegistry().getTypeHandler(String.class) instanceof CustomStringTypeHandler); assertTrue(config.getTypeHandlerRegistry().getTypeHandler(String.class,JdbcType.VARCHAR) instanceof CustomStringTypeHandler); ? ExampleObjectFactory objectFactory = (ExampleObjectFactory)config.getObjectFactory(); assertEquals(1,objectFactory.getProperties().size()); assertEquals("100",objectFactory.getProperties().getProperty("objectFactoryProperty")); ? assertTrue(config.getObjectWrapperFactory() instanceof CustomObjectWrapperFactory); ? assertTrue(config.getReflectorFactory() instanceof CustomReflectorFactory); ? ExamplePlugin plugin = (ExamplePlugin)config.getInterceptors().get(0); assertEquals(1,plugin.getProperties().size()); assertEquals("100",plugin.getProperties().getProperty("pluginProperty")); ? Environment environment = config.getEnvironment(); assertEquals("development",environment.getId()); assertTrue(environment.getDataSource() instanceof UnpooledDataSource); assertTrue(environment.getTransactionFactory() instanceof JdbcTransactionFactory); ? assertEquals("derby",config.getDatabaseId()); ? assertEquals(4,config.getMapperRegistry().getMappers().size()); assertTrue(config.getMapperRegistry().hasMapper(CachedAuthorMapper.class)); assertTrue(config.getMapperRegistry().hasMapper(CustomMapper.class)); assertTrue(config.getMapperRegistry().hasMapper(BlogMapper.class)); assertTrue(config.getMapperRegistry().hasMapper(NestedBlogMapper.class)); } finally { // System.clearProperty(XPathParser.KEY_USE_XSD); } } 一系列默认别名基本类型 public TypeAliasRegistry() { registerAlias("string",String.class); ? registerAlias("byte",Byte.class); registerAlias("long",Long.class); registerAlias("short",Short.class); registerAlias("int",Integer.class); registerAlias("integer",Integer.class); registerAlias("double",Double.class); registerAlias("float",Float.class); registerAlias("boolean",Boolean.class); ? registerAlias("byte[]",Byte[].class); registerAlias("long[]",Long[].class); registerAlias("short[]",Short[].class); registerAlias("int[]",Integer[].class); registerAlias("integer[]",Integer[].class); registerAlias("double[]",Double[].class); registerAlias("float[]",Float[].class); registerAlias("boolean[]",Boolean[].class); ? registerAlias("_byte",byte.class); registerAlias("_long",long.class); registerAlias("_short",short.class); registerAlias("_int",int.class); registerAlias("_integer",int.class); registerAlias("_double",double.class); registerAlias("_float",float.class); registerAlias("_boolean",boolean.class); ? registerAlias("_byte[]",byte[].class); registerAlias("_long[]",long[].class); registerAlias("_short[]",short[].class); registerAlias("_int[]",int[].class); registerAlias("_integer[]",int[].class); registerAlias("_double[]",double[].class); registerAlias("_float[]",float[].class); registerAlias("_boolean[]",boolean[].class); ? registerAlias("date",Date.class); registerAlias("decimal",BigDecimal.class); registerAlias("bigdecimal",BigDecimal.class); registerAlias("biginteger",BigInteger.class); registerAlias("object",Object.class); ? registerAlias("date[]",Date[].class); registerAlias("decimal[]",BigDecimal[].class); registerAlias("bigdecimal[]",BigDecimal[].class); registerAlias("biginteger[]",BigInteger[].class); registerAlias("object[]",Object[].class); ? registerAlias("map",Map.class); registerAlias("hashmap",HashMap.class); registerAlias("list",List.class); registerAlias("arraylist",ArrayList.class); registerAlias("collection",Collection.class); registerAlias("iterator",Iterator.class); ? registerAlias("ResultSet",ResultSet.class); } 其他类型 public Configuration() { typeAliasRegistry.registerAlias("JDBC",JdbcTransactionFactory.class); typeAliasRegistry.registerAlias("MANAGED",ManagedTransactionFactory.class); ? typeAliasRegistry.registerAlias("JNDI",JndiDataSourceFactory.class); typeAliasRegistry.registerAlias("POOLED",PooledDataSourceFactory.class); typeAliasRegistry.registerAlias("UNPOOLED",UnpooledDataSourceFactory.class); ? typeAliasRegistry.registerAlias("PERPETUAL",PerpetualCache.class); typeAliasRegistry.registerAlias("FIFO",FifoCache.class); typeAliasRegistry.registerAlias("LRU",LruCache.class); typeAliasRegistry.registerAlias("SOFT",SoftCache.class); typeAliasRegistry.registerAlias("WEAK",WeakCache.class); ? typeAliasRegistry.registerAlias("DB_VENDOR",VendorDatabaseIdProvider.class); ? typeAliasRegistry.registerAlias("XML",XMLLanguageDriver.class); typeAliasRegistry.registerAlias("RAW",RawLanguageDriver.class); ? typeAliasRegistry.registerAlias("SLF4J",Slf4jImpl.class); typeAliasRegistry.registerAlias("COMMONS_LOGGING",JakartaCommonsLoggingImpl.class); typeAliasRegistry.registerAlias("LOG4J",Log4jImpl.class); typeAliasRegistry.registerAlias("LOG4J2",Log4j2Impl.class); typeAliasRegistry.registerAlias("JDK_LOGGING",Jdk14LoggingImpl.class); typeAliasRegistry.registerAlias("STDOUT_LOGGING",StdOutImpl.class); typeAliasRegistry.registerAlias("NO_LOGGING",NoLoggingImpl.class); ? typeAliasRegistry.registerAlias("CGLIB",CglibProxyFactory.class); typeAliasRegistry.registerAlias("JAVASSIST",JavassistProxyFactory.class); ? languageRegistry.setDefaultDriverClass(XMLLanguageDriver.class); languageRegistry.register(RawLanguageDriver.class); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |