MyBatis源码解析(七)——DataSource数据源模块的托管数据源

原创作品,可以转载,但是要标注出处地址:http://www.cnblogs.com/V1haoge/p/6675700.html 

1 回顾

  之前介绍的非池型与池型数据源都是MyBatis自己定义的中间使用的数据源,在咱们单独使用MyBatis框架架构体系的时候会使用到,但是这种气象不多见,因为MyBatis最普遍的下方法是跟Spring进行重整并使用,这时我们当品种中貌似不会见以MyBatis内置的池型数据源,而是以外部的C3P0或者DBCP之类的老三正值数源jar包,在做第三正在数据源的下,我们便得采取及MyBatis中专门供的一个数据源工厂—-JndiDataSourceFactory。

2 JNDI数据源

  JNDI数据源只提供了一个JNDI数据源工厂:JndiDataSourceFactory,这个数据源的企图以及事务模块中MANAGED类型的政工一致,也属于托管型,它用于在动像与Spring容器整合的场子,在这种场所下,我们一般不会见利用MyBatis提供的池型连接来开展数据库访问,而是以比较专业的dbcp或c3p0来形成数据库访问,这时为了有利于使这些外部定义之数据源整合交MyBatis的环境遭受,就用利用这JNDI数据源工厂来展开得,这即是跟表面数据源对接的接口。

  也可如此清楚,这里只定义了数据源工厂,真正的数据源由外部来供,这还是纯种的悬空工厂模式。

  而MyBatis现在不过流行的用法就是暨Spring进行整理并,所有这个类似是用最频繁之,但是富有的凡在全于源码中展开,对用户是全然透明的。这里我们唯有解析是数据源工厂,至于整合后的场面后讨论。

 1 package org.apache.ibatis.datasource.jndi;
 2 import java.util.Map.Entry;
 3 import java.util.Properties;
 4 import javax.naming.Context;
 5 import javax.naming.InitialContext;
 6 import javax.naming.NamingException;
 7 import javax.sql.DataSource;
 8 import org.apache.ibatis.datasource.DataSourceException;
 9 import org.apache.ibatis.datasource.DataSourceFactory;
10 /**
11  * JNDI数据源工厂
12  * 这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器, 容器可以集 中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
13  */
14 public class JndiDataSourceFactory implements DataSourceFactory {
15 
16   public static final String INITIAL_CONTEXT = "initial_context";
17   public static final String DATA_SOURCE = "data_source";
18   //和其他数据源配置相似, 它也可以通过名为 “env.” 的前缀直接向初始上下文发送属性。 比如:
19   //env.encoding=UTF8
20   public static final String ENV_PREFIX = "env.";
21 
22   private DataSource dataSource;
23 
24   @Override
25   public void setProperties(Properties properties) {
26     try {
27       InitialContext initCtx = null;
28       Properties env = getEnvProperties(properties);
29       if (env == null) {
30         initCtx = new InitialContext();
31       } else {
32         initCtx = new InitialContext(env);
33       }
34 
35       if (properties.containsKey(INITIAL_CONTEXT)
36           && properties.containsKey(DATA_SOURCE)) {
37         Context ctx = (Context) initCtx.lookup(properties.getProperty(INITIAL_CONTEXT));
38         dataSource = (DataSource) ctx.lookup(properties.getProperty(DATA_SOURCE));
39       } else if (properties.containsKey(DATA_SOURCE)) {
40         dataSource = (DataSource) initCtx.lookup(properties.getProperty(DATA_SOURCE));
41       }
42 
43     } catch (NamingException e) {
44       throw new DataSourceException("There was an error configuring JndiDataSourceTransactionPool. Cause: " + e, e);
45     }
46   }
47 
48   @Override
49   public DataSource getDataSource() {
50     return dataSource;
51   }
52 
53   private static Properties getEnvProperties(Properties allProps) {
54     final String PREFIX = ENV_PREFIX;
55     Properties contextProperties = null;
56     for (Entry<Object, Object> entry : allProps.entrySet()) {
57       String key = (String) entry.getKey();
58       String value = (String) entry.getValue();
59       //和其他数据源配置相似, 它也可以通过名为 “env.” 的前缀直接向初始上下文发送属性。 比如:
60       //env.encoding=UTF8
61       if (key.startsWith(PREFIX)) {
62         if (contextProperties == null) {
63           contextProperties = new Properties();
64         }
65         contextProperties.put(key.substring(PREFIX.length()), value);
66       }
67     }
68     return contextProperties;
69   }
70 
71 }

  于是厂类中,很简单的定义了一个连续自DataSourceFactory的获取数据源之法子getDataSource()方法,用于获取标创建的数据源实例。

  再接下来就是同一连续自DataSourceFactory的设置属性之方,与非池型数据源工厂遭类似,JNDI型数据源也足以由此前缀的道设置有数据源的性能来传递至数码源中,用来装数据源的主干信息,所有发生安属性一方法在。

  在这厂遭定义了一个上下文概念,JNDI数据源就是经在外部数据源上覆盖一个上下文,即将数据源添加到有上下文中,将此上下文传递及工厂,由工厂由上下文中获取之数据源,并经getDataSource()被抱。

  研究够了之就是可以理解怎样进展对MyBatis来组成的程序的付出。只要针对是厂来支付就尽。

  至此,有关数据源的解析就得了了,数据源模块和前解析的作业模块为组装Environment环境之简单只重大的唯二的模块,而Environment又是构建Configuration配置类的重要模块。

  之后我们若就解析Configuration构建所要的另模块内容。

  (未完待续哦!)

网站地图xml地图