源码分析-Mybatis初始化过程
2016-04-01 15:57
489 查看
这里进行的分析我们会在下面代码处进行断点
1。步入后首先来到
我们在这里构造一个SqlSessionFactoryBuilder实例。
2。接下来来到
我们通过刚才SqlSessionFactoryBuilder的实例中的build方法,然后调用重载的build方法
在这里首先会创建一个XMLConfigBuilder,然后继续调用build的重载方法传入XMLConfigBuilder的解析,也就是对我们XMLconfig的解析,返回的是Configuration类型。在Mybatis中是使用的DOM4J的解析。
3.真正的Build,
在这里返回的是默认SqlSessionFactory,进入构造函数中看。这里需要说明一下什么是Configuration
上面我将Configuration所有信息以及构造函数列出来,具体包含了我们我们所有的在Mybatis-config.xml所配置的信息,MapperRegistry包含了我们所配置所有的Mapper信息,在MapperRegistry中维护了一个HashMap()如下:
在我们sqlsessio中会详细讲解。
4.DefaultSqlSessionFactory是我们的SqlSession工厂,其中主要的方法是opensession();
这个我们以后会详细讲解。
sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
1。步入后首先来到
public SqlSessionFactoryBuilder() { }
我们在这里构造一个SqlSessionFactoryBuilder实例。
2。接下来来到
public SqlSessionFactory build(InputStream inputStream) { return this.build((InputStream)inputStream, (String)null, (Properties)null); }
我们通过刚才SqlSessionFactoryBuilder的实例中的build方法,然后调用重载的build方法
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { SqlSessionFactory var5; try { XMLConfigBuilder e = new XMLConfigBuilder(inputStream, environment, properties); var5 = this.build((Configuration)e.parse()); } catch (Exception var14) { throw ExceptionFactory.wrapException("Error building SqlSession.", var14); } finally { ErrorContext.instance().reset(); try { inputStream.close(); } catch (IOException var13) { ; } } return var5; }
在这里首先会创建一个XMLConfigBuilder,然后继续调用build的重载方法传入XMLConfigBuilder的解析,也就是对我们XMLconfig的解析,返回的是Configuration类型。在Mybatis中是使用的DOM4J的解析。
3.真正的Build,
public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config); }
在这里返回的是默认SqlSessionFactory,进入构造函数中看。这里需要说明一下什么是Configuration
public class Configuration { protected Environment environment; protected boolean safeRowBoundsEnabled; protected boolean safeResultHandlerEnabled; protected boolean mapUnderscoreToCamelCase; protected boolean aggressiveLazyLoading; protected boolean multipleResultSetsEnabled; protected boolean useGeneratedKeys; protected boolean useColumnLabel; protected boolean cacheEnabled; protected boolean callSettersOnNulls; protected String logPrefix; protected Class<? extends Log> logImpl; protected LocalCacheScope localCacheScope; protected JdbcType jdbcTypeForNull; protected Set<String> lazyLoadTriggerMethods; protected Integer defaultStatementTimeout; protected Integer defaultFetchSize; protected ExecutorType defaultExecutorType; protected AutoMappingBehavior autoMappingBehavior; protected Properties variables; protected ReflectorFactory reflectorFactory; protected ObjectFactory objectFactory; protected ObjectWrapperFactory objectWrapperFactory; protected MapperRegistry mapperRegistry; protected boolean lazyLoadingEnabled; protected ProxyFactory proxyFactory; protected String databaseId; protected Class<?> configurationFactory; protected final InterceptorChain interceptorChain; protected final TypeHandlerRegistry typeHandlerRegistry; protected final TypeAliasRegistry typeAliasRegistry; protected final LanguageDriverRegistry languageRegistry; protected final Map<String, MappedStatement> mappedStatements; protected final Map<String, Cache> caches; protected final Map<String, ResultMap> resultMaps; protected final Map<String, ParameterMap> parameterMaps; protected final Map<String, KeyGenerator> keyGenerators; protected final Set<String> loadedResources; protected final Map<String, XNode> sqlFragments; protected final Collection<XMLStatementBuilder> incompleteStatements; protected final Collection<CacheRefResolver> incompleteCacheRefs; protected final Collection<ResultMapResolver> incompleteResultMaps; protected final Collection<MethodResolver> incompleteMethods; protected final Map<String, String> cacheRefMap; public Configuration(Environment environment) { this(); this.environment = environment; } public Configuration() { this.safeRowBoundsEnabled = false; this.safeResultHandlerEnabled = true; this.mapUnderscoreToCamelCase = false; this.aggressiveLazyLoading = true; this.multipleResultSetsEnabled = true; this.useGeneratedKeys = false; this.useColumnLabel = true; this.cacheEnabled = true; this.callSettersOnNulls = false; this.localCacheScope = LocalCacheScope.SESSION; this.jdbcTypeForNull = JdbcType.OTHER; this.lazyLoadTriggerMethods = new HashSet(Arrays.asList(new String[]{"equals", "clone", "hashCode", "toString"})); this.defaultExecutorType = ExecutorType.SIMPLE; this.autoMappingBehavior = AutoMappingBehavior.PARTIAL; this.variables = new Properties(); this.reflectorFactory = new DefaultReflectorFactory(); this.objectFactory = new DefaultObjectFactory(); this.objectWrapperFactory = new DefaultObjectWrapperFactory(); this.mapperRegistry = new MapperRegistry(this); this.lazyLoadingEnabled = false; this.proxyFactory = new JavassistProxyFactory(); this.interceptorChain = new InterceptorChain(); this.typeHandlerRegistry = new TypeHandlerRegistry(); this.typeAliasRegistry = new TypeAliasRegistry(); this.languageRegistry = new LanguageDriverRegistry(); this.mappedStatements = new Configuration.StrictMap("Mapped Statements collection"); this.caches = new Configuration.StrictMap("Caches collection"); this.resultMaps = new Configuration.StrictMap("Result Maps collection"); this.parameterMaps = new Configuration.StrictMap("Parameter Maps collection"); this.keyGenerators = new Configuration.StrictMap("Key Generators collection"); this.loadedResources = new HashSet(); this.sqlFragments = new Configuration.StrictMap("XML fragments parsed from previous mappers"); this.incompleteStatements = new LinkedList(); this.incompleteCacheRefs = new LinkedList(); this.incompleteResultMaps = new LinkedList(); this.incompleteMethods = new LinkedList(); this.cacheRefMap = new HashMap(); this.typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class); this.typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class); this.typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class); this.typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class); this.typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class); this.typeAliasRegistry.registerAlias("PERPETUAL", PerpetualCache.class); this.typeAliasRegistry.registerAlias("FIFO", FifoCache.class); this.typeAliasRegistry.registerAlias("LRU", LruCache.class); this.typeAliasRegistry.registerAlias("SOFT", SoftCache.class); this.typeAliasRegistry.registerAlias("WEAK", WeakCache.class); this.typeAliasRegistry.registerAlias("DB_VENDOR", VendorDatabaseIdProvider.class); this.typeAliasRegistry.registerAlias("XML", XMLLanguageDriver.class); this.typeAliasRegistry.registerAlias("RAW", RawLanguageDriver.class); this.typeAliasRegistry.registerAlias("SLF4J", Slf4jImpl.class); this.typeAliasRegistry.registerAlias("COMMONS_LOGGING", JakartaCommonsLoggingImpl.class); this.typeAliasRegistry.registerAlias("LOG4J", Log4jImpl.class); this.typeAliasRegistry.registerAlias("LOG4J2", Log4j2Impl.class); this.typeAliasRegistry.registerAlias("JDK_LOGGING", Jdk14LoggingImpl.class); this.typeAliasRegistry.registerAlias("STDOUT_LOGGING", StdOutImpl.class); this.typeAliasRegistry.registerAlias("NO_LOGGING", NoLoggingImpl.class); this.typeAliasRegistry.registerAlias("CGLIB", CglibProxyFactory.class); this.typeAliasRegistry.registerAlias("JAVASSIST", JavassistProxyFactory.class); this.languageRegistry.setDefaultDriverClass(XMLLanguageDriver.class); this.languageRegistry.register(RawLanguageDriver.class); }
上面我将Configuration所有信息以及构造函数列出来,具体包含了我们我们所有的在Mybatis-config.xml所配置的信息,MapperRegistry包含了我们所配置所有的Mapper信息,在MapperRegistry中维护了一个HashMap()如下:
private final Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap();
在我们sqlsessio中会详细讲解。
4.DefaultSqlSessionFactory是我们的SqlSession工厂,其中主要的方法是opensession();
public SqlSession openSession() { return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false); }
这个我们以后会详细讲解。
相关文章推荐
- 算法--合并两个有序数组
- EventBus原理(哈哈偷了鸿洋大神的一句归纳)
- c++作业2
- 操作系统实验2-作业调度1.0
- ABP源码分析十九:Auditing
- 重载,类型转换和运算符
- 算法时间复杂度的计算 [整理]
- JavaScrpit生日日期
- Html5 - 日期和时间选择输入
- dev -c++ 快捷键
- IOS各种开发者帐号和发布类型
- ul标签nav使用
- 从学校到现在的一个总结
- 夺命雷公狗---DEDECMS----30dedecms数据dede_archives主表进行查询l操作
- HTML/CSS中table表格布局
- Java连接Mysql数据库步骤
- 自从踏上linux运维学习的征途
- 杭电Problem1878 欧拉回路 并查集 + 欧拉回路
- Oracle 检查表的数据变动
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结