目次
2.コンポーネントのコンテンツを説明するXSDファイルを定義します
3. AbstractSingleBeanDefinitionParserインターフェースを継承するクラスを作成して、XSDファイル内の定義とコンポーネント定義を解析します。
4. NamespaceHandlerSupportから拡張されたハンドラーファイルを作成します。目的は、コンポーネントをSpringコンテナーに登録することです。
5.Spring.handlersファイルとSpring.schemasファイルを書き込みます
6.テスト構成ファイルを作成し、対応する名前空間とXSDを構成ファイルに導入した後、カスタムラベルを直接使用できます。
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());
}
}
コンソール印刷:
テストが完了しました。