Springソースコードの詳細分析(第2版)-カスタムタグの使用

目次

I.はじめに

1はじめに

2.ツールバージョン

次に、プロジェクトのディレクトリ構造

第三に、カスタムラベルの使用

1.POJOを作成します

2.コンポーネントのコンテンツを説明するXSDファイルを定義します

3. AbstractSingleBeanDefinitionParserインターフェースを継承するクラスを作成して、XSDファイル内の定義とコンポーネント定義を解析します。

4. NamespaceHandlerSupportから拡張されたハンドラーファイルを作成します。目的は、コンポーネントをSpringコンテナーに登録することです。

5.Spring.handlersファイルとSpring.schemasファイルを書き込みます

6.テスト構成ファイルを作成し、対応する名前空間とXSDを構成ファイルに導入した後、カスタムラベルを直接使用できます。

7.テスト


I.はじめに

1はじめに

「SpringSourceCode Deep Analysis(Second Edition)」第4章デフォルトラベルの分析セクション1カスタムラベルの使用では、解析を学習する前に、カスタムラベルを使用するプロセスを理解する必要があります。この記事は、本のカスタムラベルの内容に従ってテストされています。

2.ツールバージョン:

IntelliJ IDEA 2019.1.2

Javaバージョン「1.8.0_77」

Springバージョン5.2.0.BUILD-SNAPSHOT

次に、プロジェクトのディレクトリ構造

赤い枠内のファイルを見てください(テスト用にダウンロードしたソースコードにモジュールを追加してください)

第三に、カスタムラベルの使用

        多くの場合、システムの構成可能なサポートを提供する必要があります。単純なメソッドはSpringの標準Beanに基づいて直接構成できますが、構成がより複雑であるか、より豊富な制御が必要な場合、非常に扱いにくくなります。一般的なアプローチは、定義されたXMLファイルを元の生態学的な方法で解析し、それを構成オブジェクトに変換することです。この方法は確かにすべての問題を解決できますが、実装がより面倒です。特に構成が非常に複雑な場合、分析作業は考慮しなければならない負担です。Springは拡張可能なスキーマのサポートを提供しますが、これは適切な妥協案です。Springカスタムラベル構成を拡張するには、通常、次の手順が必要です(Springのコアパッケージがプロジェクトに追加されている場合)。

  • 拡張が必要な​​コンポーネントを作成します。
  • コンポーネントのコンテンツを記述するXSDファイルを定義します。
  • BeanDefinitionParserインターフェースを実装して、XSDファイル内の定義とコンポーネントを解析するファイルを作成します。
  • 定義。
  • NamespaceHandlerSupportから拡張されたハンドラーファイルを作成します。目的は、コンポーネントをSpringに登録することです。
  • 容器。
  • Spring.handlersファイルとSpring.schemasファイルを記述します。
  • 次に、上記の手順に従って、カスタムラベル付けのプロセスを段階的に説明します。

1.POJOを作成します

ユーザー

package com.asyf.chapter04;

public class User {

	private String id;

	private String userName;

	private String email;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	@Override
	public String toString() {
		return "User{" +
				"id='" + id + '\'' +
				", userName='" + userName + '\'' +
				", email='" + email + '\'' +
				'}';
	}
}

2.コンポーネントのコンテンツを説明するXSDファイルを定義します

user.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
		targetNamespace="http://www.lexueba.com/schema/user"
		xmlns:tns="http://www.lexueba.com/schema/user"
		elementFormDefault="qualified">

	<element name="user">
		<complexType>
			<attribute name="id" type="string"/>
			<attribute name="userName" type="string"/>
			<attribute name="email" type="string"/>
		</complexType>
	</element>

</schema>

3. AbstractSingleBeanDefinitionParserインターフェースを継承するクラスを作成して、XSDファイル内の定義とコンポーネント定義を解析します。

package com.asyf.chapter04;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;

public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

	// Element对应的类
	protected Class getBeanClass(Element element) {
		return User.class;
	}

	// 从element中解析并提取对应的元素
	protected void doParse(Element element, BeanDefinitionBuilder beanDefinitionBuilder) {
		String id = element.getAttribute("id");
		String userName = element.getAttribute("userName");
		String email = element.getAttribute("email");
		// 将提取的数据放到BeanDefinitionBuilder中,待完成所有bean的解析后统一注册到BeanFactory中
		if (StringUtils.hasText("id")) {
			beanDefinitionBuilder.addPropertyValue("id", id);
		}
		if (StringUtils.hasText(userName)) {
			beanDefinitionBuilder.addPropertyValue("userName", userName);
		}
		if (StringUtils.hasText(email)) {
			beanDefinitionBuilder.addPropertyValue("email", email);
		}
	}

}

注:この本に書かれていることは、BeanDefinitionParserインターフェースを実装して、XSDファイル内の定義とコンポーネント定義を解析するファイルを作成することです。クラス図を見ると、AbstractSingleBeanDefinitionParserはBeanDefinitionParserインターフェースを実装しています。

4. NamespaceHandlerSupportから拡張されたハンドラーファイルを作成します。目的は、コンポーネントをSpringコンテナーに登録することです。

package com.asyf.chapter04;

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

public class MyNamespaceHandler extends NamespaceHandlerSupport {

	@Override
	public void init() {
		registerBeanDefinitionParser("user", new UserBeanDefinitionParser());
	}

}

5.Spring.handlersファイルとSpring.schemasファイルを書き込みます

デフォルトの場所は、プロジェクトの/ META-INF /フォルダーの下です。もちろん、Springを拡張するか、ソースコードを変更することで、パスを変更できます。

  • spring.handlers

http \://www.lexueba.com/schema/user=com.asyf.chapter04.MyNamespaceHandler

  • spring.schemas

http \://www.lexueba.com/schema/user.xsd=META-INF/user.xsd

6.テスト構成ファイルを作成し、対応する名前空間とXSDを構成ファイルに導入した後、カスタムラベルを直接使用できます。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:myname="http://www.lexueba.com/schema/user"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.lexueba.com/schema/user http://www.lexueba.com/schema/user.xsd">

    <myname:user id="testbean" userName="aaa" email="[email protected]"/>

</beans>

7.テスト

package com.asyf.chapter04;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class MyTest {

	public static void main(String[] args) {
		BeanFactory bf = new XmlBeanFactory(new ClassPathResource("test.xml"));
		User user = (User) bf.getBean("testbean");
		System.out.println(user.toString());
	}

}

コンソール印刷:

テストが完了しました。

おすすめ

転載: blog.csdn.net/cs373616511/article/details/107464844