原创作品,可以转载,但是请标注出处地址: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构建所需的其他模块内容。

  (未完待续哦!)

浩哥解析MyBatis源码(七)——DataSource数据源模块之托管数据源的更多相关文章

  1. 浩哥解析MyBatis源码(四)——DataSource数据源模块

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6634880.html 1.回顾 上一文中解读了MyBatis中的事务模块,其实事务操作无非 ...

  2. 浩哥解析MyBatis源码(十)——Type类型模块之类型处理器

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...

  3. 浩哥解析MyBatis源码(五)——DataSource数据源模块之非池型数据源

    1 回顾 上一篇中我解说了数据源接口DataSource与数据源工厂接口DataSourceFactory,这二者是MyBatis数据源模块的基础,包括本文中的非池型非池型数据源(UnpooledDa ...

  4. 浩哥解析MyBatis源码(六)——DataSource数据源模块之池型数据源

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675674.html 1 回顾 上一文中解读了MyBatis中非池型数据源的源码,非池型也 ...

  5. 浩哥解析MyBatis源码(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...

  6. 浩哥解析MyBatis源码(二)——Environment环境

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6625612.html 本应该先开始说Configuration配置类的,但是这个类有点过于 ...

  7. 浩哥解析MyBatis源码(十一)——Parsing解析模块之通用标记解析器(GenericTokenParser)与标记处理器(TokenHandler)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6724223.html 1.回顾 上面的几篇解析了类型模块,在MyBatis中类型模块包含的 ...

  8. 浩哥解析MyBatis源码(十二)——binding绑定模块之MapperRegisty

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6758456.html 1.回顾 之前解析了解析模块parsing,其实所谓的解析模块就是为 ...

  9. 浩哥解析MyBatis源码(九)——Type类型模块之类型处理器注册器(TypeHandlerRegistry)

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6709157.html 1.回顾 上一篇研究的是类型别名注册器TypeAliasRegist ...

随机推荐

  1. 【UWP】FFmpeg库的编译

    本文是关于windows8.1/windows10通用应用下编译ffmpeg的一些需要注意的地方,针对最新的msys2而写,都是我在实际操作中遇到的,但是网上没有提到的.如果大家遇到什么问题或是在之前 ...

  2. C语言的基本概念

    1.经典入门:hello world #include <stdio.h> int main(void) { printf("hello world.\n"); ; } ...

  3. p1154 地平线

    题目描述 Farmer John的牛们认为,太阳升起的那一刻是一天中最美好的,在那时她们可以看到远方城市模糊的轮廓.显然,这些轮廓其实是城市里建筑物模糊的影子. 建筑物的影子实在太模糊了,牛们只好把它 ...

  4. Kafka概述与设计原理

    kafka是一种高吞吐量的分布式发布订阅消息系统,有如下特性: 1. 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能. 2 .高吞吐量:即使是 ...

  5. 卷积神经网络(CNN)模型结构

    在前面我们讲述了DNN的模型与前向反向传播算法.而在DNN大类中,卷积神经网络(Convolutional Neural Networks,以下简称CNN)是最为成功的DNN特例之一.CNN广泛的应用 ...

  6. 如何通过Visual Studio来管理我们的数据库项目

    某日的一个早晨,产品早上来告诉我说要把之前变更的一个功能更改回原来的设计内容,作为程序员大家都最讨厌需求来回反复变更,但是没有办法,苦逼的程序员最终还是继续要改,毕竟是给老板打工的,但是发现我们之前的 ...

  7. 每天一个Linux命令(01)--ls命令

    ls命令是Linux下最常用的命令.ls命令就是list的缩写,缺省下ls用来打印当前目录的清单,如果ls指定其他目录,那么就会显示指定目录里的文件及文件夹清单.通过ls命令不仅可以查看Linux文件 ...

  8. MyBatis 源码分析——类型处理器

    官网上面讲到:无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型.那 ...

  9. smarty模板基础1

    smarty模板的作用可以让前端和后端分离(也就是前端的显示页面和后端的php代码). smarty模板的核心是一个类,下载好的模板中有这么几个重要的文件夹 (1)libs核心文件夹(2)int.in ...

  10. centOS7 mini配置linux服务器(一)安装centOs7

    1. 准备centos-7 (minni镜像) 官网地址http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minim ...