mybatisソースコード構成ファイル分析の1つ:プロパティタグの分析

mybatisは日常の開発に共通のORMフレームワークとして、開発において非常に重要な役割を果たしています。mybatisのソースコードを理解することは、日常の開発に非常に役立ちます。ソースコードのバージョンは3-3.4.xで、githubにダウンロードできます。

この記事から、mybatisのコア構成ファイル(mybatis-config.xml)を1つずつ分析していきますが、今日は、プロパティタグの解決プロセスを見てみましょう。

1.概要
mybatisを単独で使用する場合、mybatisのコア構成ファイル(mybatis-config.xml)は特に重要です。これはmybatis操作全体の基礎となります。構成ファイル内のタグが正しく解析されて初めて、正しく使用できます。 Mybatis、以下のプロパティタグの設定を見てください。プロパティタグの役割は、プロパティファイルまたはプロパティタグをロードすることです。以下の特定の設定を参照してください。例は次のとおりです。

<properties resource = "org / mybatis / example / config.properties">
<property name = "username" value = "dev_user" />
<property name = "password" value = "F2Fa3!33TYyg" />
</ properties>
上記は設定済みプロパティタグの設定であり、リソース属性とプロパティサブタグはタグで設定されます。特定の解析プロセスを見てみましょう。ここでは、プロパティタブの解析プロセスを分析します。ここでは、プロセスを開始せずに、解析コードを見てみましょう。

次に、
上記で詳しく説明したように、プロパティタグの構成を確認しました。次に、parseメソッドを見てみましょう。ここでは、コードの一部のみを貼り付けます。以下は、parseConfigurationメソッドのコードです。

コードをコピーします
private void parseConfiguration(XNode root){
try {
// issue#117 read properties first
// properties tag
propertiesElement(root.evalNode( "properties"));
//設定タグを解決します
Properties settings = settingsAsProperties(root.evalNode ( "settings"));
loadCustomVfs(settings);
//エイリアスタグを解決します(例:<typeAlias alias = "user" type = "cn.com.bean.User" />
typeAliasesElement(root.evalNode( "typeAliases")) ;
//プラグ
インタグを解決しますpluginElement(root.evalNode( "plugins"));
// objectFactoryタグを解決します。このタグの役割は、mybatisが結果のオブジェクトの新しいインスタンスが作成されるたびにObjectFactoryを使用する
ことです。 DefaultObjectFactoryを使用して、設定後、set
objectFactoryElement(root.evalNode( "objectFactory"));を作成します。
// objectWrapperFactoryタグを解析します
objectWrapperFactoryElement(root.evalNode( "objectWrapperFactory"));
//解析reflectorFactory标签reflectorFactoryElement
(root.evalNode( "reflectorFactory"));
settingsElement(settings);
// objectFactoryおよびobjectWrapperFactoryの発行後に読み取ります#631
//解析environments
标签environmentsElement(root.evalNode( "environments"));
databaseIdProviderElement(root.evalNode( "databaseIdProvider"));
typeHandlerElement(root.evalNode( "typeHandlers"));
//解析<mappers>
标签mapperElement(root.evalNode( "mappers"));
} catch(Exception e){
throw new BuilderException( "Error parsing SQL Mapper Configuration。原因:" + e、e);



propertiesElement(root.evalNode( "properties"));
このメソッドは、プロパティタグを解析するためのものです。以下の特定の分析プロセスを見てみましょう。

1. サブタグと属性の
コピーコードを解析します
/ **
* mybatis-config.xmlファイルのプロパティタグを解析します
* <properties resource = "org / mybatis / example / config.properties">
* <property name = "username" value = "dev_user" />
* <property name = "password" value = "F2Fa3!33TYyg" />
* </ properties>
*分析手順:
* 1.構成されたプロパティタグを分析してデフォルトに配置する;
* 2.分析するresourceまたはurl属性はデフォルトに配置されます。
* 3.構成内の変数値を取得してデフォルトに配置します
* @param context
* @throws Exception
* /
private void propertiesElement(XNode context)throws Exception {
if(context!= null){
// 1、プロパティタグのプロパティタグを読み取る<property name = "" value = "" />
プロパティdefaults = context.getChildrenAsProperties();
// 2、プロパティタグのリソースとURL属性を読み取ります
String resource = context.getStringAttribute( "resource");
String url = context.getStringAttribute( "url");
//リソースとURL属性を同時にプロパティタグに表示することはできませんで
IF(!!リソース= NULL && URL = NULL){
スロー新しい新しいBuilderExceptionは(「プロパティ要素CANのプロパティファイルのリファレンスベースURLとAリソースを両方Aを指定しないで、どちらか一方を指定してください..」);
}
//リソース場合空でない、解決プロパティとして、デフォルトに、キーと値のデフォルト構造は、同じキーが値上書きされている
IF(!ヌルリソース=){
defaults.putAll(Resources.getResourceAsProperties(リソース));
} else if(url!= null){// URLが空でない場合、プロパティとして解析され、デフォルトに配置されます。デフォルトはキーと値の構造であるため、同じキーの値
defaults.putAll(Resources。getUrlAsProperties(url));
}
// 3.構成内の変数変数の値を取得します。この変数は、SqlSessionFactoryBuilder.build()
プロパティを介してプロパティプロパティ値に渡すことができます。プロパティvars = configuration.getVariables();
//ビルドが呼び出されたときにプロパティプロパティが渡される場合、デフォルト
IF(!VARS = NULL){
defaults.putAll(VARS);
}
//パーサーおよび構成にオブジェクト
parser.setVariables(デフォルト)を、
configuration.setVariables(デフォルト);
}
}
コードコピー
上記からの解析プロセスでわかるように、最初にプロパティタグのサブタグ、つまり次のメソッドで取得されるプロパティタグを解析します。

// 1、プロパティタグのプロパティタグを読み取る<property name = "" value = "" />
Properties defaults = context.getChildrenAsProperties();
プロパティタグを解析し、Propertiesオブジェクトに配置します。では、Propertiesオブジェクト、getChildrenAsPropertiesメソッドで盗難を防ぐ方法は、

コードをコピーします
public Properties getChildrenAsProperties(){
Properties properties = new Properties();
for(XNode child:getChildren()){
String name = child.getStringAttribute( "name");
String value = child.getStringAttribute( "value");
if(name!= null && value!= null){
properties.setProperty(name、value);
}
}
return properties;
}
コード
コピーしてループプロパティタグであることを確認し、その名前と値のプロパティを取得して、プロパティオブジェクトに配置しますで。

次に、次のようにプロパティのリソースとURLプロパティを解析します

// 2.プロパティタグ内のリソースとURL属性を読み取ります
String Resource = context.getStringAttribute( "resource");
String url = context.getStringAttribute( "url");
リソースとURL属性をそれぞれ取得します。それはすべて道です。

2.処理属性については
、以下のこの判断を見てください

//
(resource!= null && url!= null){
throw new BuilderException( "properties要素は、URLとリソースベースのプロパティファイル参照の両方を指定できません。どちらか一方を指定してください。 ");
}
この判断は、プロパティタグにresource属性とurl属性を同時に指定できないことを示しています。

2.1。resource属性とurl属性
処理ここで、resource属性とurl属性の処理を見てみましょうここでは、resourceとurlの2つの属性はどちらもパスを表すため、対応するパスの下にあるファイルを読み取る必要があります。

コードをコピーします
//リソースが空でない場合、プロパティとして解析され、デフォルトに配置されます。デフォルトはキーと値の構造であるため、同じキーの値を上書きします
if(resource!= Null){
defaults.putAll(Resources.getResourceAsProperties (リソース));
} else if(url!= null){// URLが空でない場合、プロパティとして解析され、デフォルトに配置されます。デフォルトはキーと値の構造であるため、同じキーの
デフォルトの値をオーバーライドします。 putAll(Resources.getUrlAsProperties(url));
} 以下
のコードをコピーし
てリソースの処理を確認し、Resources.getResourceAsProperties(resource))メソッドを呼び出してリソースを処理します。

コードをコピーする
public static Properties getResourceAsProperties(String resource)throws IOException {
Properties props = new Properties();
InputStream in = getResourceAsStream(resource);
props.load(in);
in.close();
return props;
} 上記から
コード
コピーするコードはInputStreamに変換され、最後にPropertiesオブジェクト(ここではファイルをロードする詳細なプロセス)に入れて、後で詳細に分析することがわかります。

URLの処理を見てみましょう。Resources.getUrlAsProperties(url)メソッドを呼び出してURLを処理します。

コードのコピー
IOExceptionをスロー(文字列urlString)パブリック静的getUrlAsPropertiesをプロパティ{
;プロパティの小道具=新しい新しいプロパティ()
; getUrlAsStream =において入力ストリーム(urlString)を
props.load(IN);
in.close();
小道具を返す;
}
コードをコピー
の上にコードは、urlで表されるファイルを引き続きPropertiesオブジェクトに処理します。

2.3。追加されたプロパティの
処理propertyサブタグ、リソース、およびurl属性を処理した後、次の処理も実行されます。つまり、構成からプロパティを取得します。

コードをコピー
// 3、構成内の変数変数の値を取得します。この変数は、SqlSessionFactoryBuilder.build()を介してプロパティプロパティ値に渡すことができ
ます。プロパティvars = configuration.getVariables();
//ビルドが呼び出されたときにプロパティプロパティが渡される場合、defaults
if(vars!= Null){
defaults.putAll(vars);
}
コードをコピー
するプロパティ情報が構成に既に存在する場合は、それを取り出してデフォルトに配置します。

2.4。設定オブジェクトに入れ
、上記の処理を経て、最後にすべてのプロパティ情報を設定に入れます、

//パーサーと設定オブジェクトに配置します
parser.setVariables(デフォルト);
configuration.setVariables(デフォルト));
mybatis環境全体のすべてのプロパティ情報を表す設定変数属性にデフォルトを配置します。この情報は、$ {key}を使用してmybatisの構成ファイルで使用できます。たとえば、$ {username}は、構成変数からユーザー名をキーとする属性値を見つけ、自動属性値置換を実行します。

3番目に、
上記のプロパティタグの解析プロセスの分析が分析されます。最初にプロパティタグが解析され、次にリソースとURL属性が解析され、最後にSqlSessionFactoryBuilderのビルドメソッドである上記の解析プロセスからの受信プロパティを使用してSqlSessionFactoryが生成されます。重複するキーがあり、解析される最初のキーは後の分析によって上書きされます。つまり、解析プロセスは次のとおりです。プロパティサブタグ->リソース-> url->開発者セット、上書きプロセスは次のとおりです:開発者set-> url-> resource-> propertyサブタグ。優先度が最も高いプロパティは、開発者自身が設定します。

おすすめ

転載: www.cnblogs.com/ytg568524/p/12695335.html
おすすめ