MyBatisMyBatis源码解析(二)——Environment环境

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

  本应该先开始说Configuration配置类的,但是这仿佛小过分复杂,因为MyBatis中之拥有配置起全部在这近乎吃,可谓面面俱到,一开始即谈谈如此宏大上之事物,貌似有些不合适,认识及读书都应当从小开始,从基础开始,所以自己做了这么一个略布置,先挑Configuration中主要的布局起进行了解,心中来矣大体上印象之后,在拓展Configuration的解读,这样就能比较轻松的收受任何中复杂的布信息,而不至于不知所措。

  首先我们来探Environment——环境

  先说说咱耳熟能详的始末,当我们单独采取MyBatis框架时(不跟Spring框架整合),是得在Configuration.xml配置文件被开展环境布置的,其代码如下:

 1 <environments default="development">
 2     <environment id="development">
 3         <transactionManager type="JDBC"/>
 4         <dataSource type="POOLED">
 5             <property name="driver" value="com.mysql.jdbc.Driver"/>
 6             <property name="url" value="jdbc:mysql://localhost:3306/mbtest"/>
 7             <property name="username" value="root"/>
 8             <property name="password" value="123456"/>
 9         </dataSource>
10     </environment>
11 </environments>

  从者的布局内容被好见到,标签environment代表的哪怕是条件,其有一个性质id,值为“development”(表示出条件,对应之尚会有生育环境),而在那属下节点还待配备有限独内容:transactionManager和DataSource,前者是事务管理器,后者是数据源。“JDBC”表示事务管理器是JDBC类型了,这个标签对承诺Configuration类创建时于那不论是参构造器中登记的型别名,通过这路别名注册信息可找到实际的JDBC事务工厂类:JdbcTransactionFactory(JDBC事务工厂,这个仿佛后会介绍至,稍安勿躁)。而数据源的类型也“POOLED”类型,同样可以在Configuration类的任参构造器中找到相应之注册信息:PooledDataSourceFactory(表示出连接池的数据源工厂,这个看似后也会介绍)。

  而我辈若介绍的Environment类就是其一environment标签所表示的环境类,构建Configuration之前,第一步是拓展路别名注册,第二步就是是将Environment配置内容由配置文件被读入Environment类中(这同样步是于XMLConfigBuilder中做到的),并将该重组及Configuration类中。

  Environment类位于org.apache.ibatis.mapping包下,整个类吃final修饰,这表示这个仿佛是独极度终类,就使String类一样,是一个不可被再改之近乎,即该实例是唯一的无能够为随便修改。

  下方列出Environment类的源码

 1 package org.apache.ibatis.mapping;
 2 import javax.sql.DataSource;
 3 import org.apache.ibatis.transaction.TransactionFactory;
 4 /**
 5  * 环境
 6  * 决定加载哪种环境(开发环境/生产环境)
 7  */
 8 public final class Environment {
 9   //环境id
10   private final String id;
11   //事务工厂
12   private final TransactionFactory transactionFactory;
13   //数据源
14   private final DataSource dataSource;
15   public Environment(String id, TransactionFactory transactionFactory, DataSource dataSource) {
16     if (id == null) {
17       throw new IllegalArgumentException("Parameter 'id' must not be null");
18     }
19     if (transactionFactory == null) {
20         throw new IllegalArgumentException("Parameter 'transactionFactory' must not be null");
21     }
22     this.id = id;
23     if (dataSource == null) {
24       throw new IllegalArgumentException("Parameter 'dataSource' must not be null");
25     }
26     this.transactionFactory = transactionFactory;
27     this.dataSource = dataSource;
28   }
29   //一个静态内部类Builder
30   //建造模式
31   //用法应该是new Environment.Builder(id).transactionFactory(xx).dataSource(xx).build();
32   public static class Builder {
33       private String id;
34       private TransactionFactory transactionFactory;
35       private DataSource dataSource;
36     public Builder(String id) {
37       this.id = id;
38     }
39     public Builder transactionFactory(TransactionFactory transactionFactory) {
40       this.transactionFactory = transactionFactory;
41       return this;
42     }
43     public Builder dataSource(DataSource dataSource) {
44       this.dataSource = dataSource;
45       return this;
46     }
47     public String id() {
48       return this.id;
49     }
50     public Environment build() {
51       return new Environment(this.id, this.transactionFactory, this.dataSource);
52     }
53   }
54   public String getId() {
55     return this.id;
56   }
57   public TransactionFactory getTransactionFactory() {
58     return this.transactionFactory;
59   }
60   public DataSource getDataSource() {
61     return this.dataSource;
62   }
63 }

  通过源码我们得窥见,在Environment类中起三独字段:id、transactionFactory、dataSource,分别针对应于配置文件被的老三只布局起(id、transactionManager、DataSource),而且就三码都为final类型,表示不可被改,一差设置终身有效,所以于所有类中也只是使用三参构造器为老三码字段赋值,而尚未set方法可展开字段值的变动,只有get方法,可以取得到安装的音。

  Environment类内部发生一个静态内部类Builder,这肯定是一个构建器类,所以Environgment实例的创建以了构建者模式(也于建造者模式)。我们自然可以直接用外部类的构造器直接进行实例创建,但立刻并无是MyBatis推荐的(当然其实为未会见要求你失去手动创建Environgment实例,这里就是从个如),MyBatis内部开展Environgment实例创建时,就是用其内部构建者进行创办,创建方式和源码中注释里平等:

new Environment.Builder(id).transactionFactory(xx).dataSource(xx).build();

  为什么而动构建者模式吧?那让咱们来回顾一下构建者模式的内容。

  构建者模式相似用来构建复杂对象时,将复杂对象分割成多聊目标开展分级构建,然后整合在一起形成一个特别目标,这样做能挺好之专业对象构建的细节经过,这里也是一律的目的,虽然说Environment类的字段较少,但于MyBatis中大量动构建者模式的根基及,在这里使用构建者模式为无可厚非,而且经过中类的方式构建,这个Environment对象的创造会于其中类构建方法build()被显式调用时才见面当内存中创造,实现了懒加载。这同时微微单例模式的意思在内,虽然Mybatis中只是创多独Environment环境,但是当规范运作时,只会在一个环境,确实是应用中类实现了懒加载的单例模式。

  这个实例的创最强烈的使位置就是是以XMLConfigBuilder构建器中剖析构建Configuration类时以分析了Configuration.xml配置文件中environment标签的情节后,这个岗位用于将读自于配置文件之布局信息配置到了Environment对象被。(这词话出接触拗口,不要焦躁,这个过程在后来介绍XMLConfigBuilder类时会见发出介绍的)

  其实这个类似非常简短,但其里面含有的TracsactionFactory和DataSource这片单内容而是鲜充分块内容,这同样片容后介绍。

  自己了解的还充分浅显,希望随着不断的解读源码,能够提升自己的认识,到下又来此开展更加改良。

  (未完待续)

网站地图xml地图