Spring-カスタムラベルの実装と使用

I.はじめに

春のデフォルトのラベル解決と登録の実装に関する記事を記録しました。
今回はカスタムタグを記録してその記事と組み合わせ、理解を深めます

第二に、テキスト

まず、スプリングラベルをカスタマイズして、Beanラベルのように使用する方法を見てみましょう。最初に、全体的なプロセスの一部を概説します。

  1. 拡張が必要な​​コンポーネントを作成する
  2. コンポーネントのコンテンツを説明するXSDファイルを定義します
  3. BeanDefinitionParserインターフェースを実装するJavaクラスを作成して、XSDファイル内の定義とコンポーネント定義を解析します。
  4. Handlerクラスを作成し、拡張します。NameSpaceHandlerSupport目的は、コンポーネントをコンテナーに登録することです。
  5. Spring.handlers和Spring.schemasファイルを書き込む(追加する)

上記の作業が完了したら、カスタムラベルを使用できます。

1.pojoクラスを作成します

 
public class User {
    
    
 
	private String name;
	private String sex;
	private String email;
	private String id;
	
	//set get method...
	
}

2.コンポーネントクラスのコンテンツを記述するxsdファイルを定義します

以前は、Springはdtdファイルを使用していましたが、現在はほとんどすべてがxsdファイルを使用しています。xsdファイルの定義がわからない場合は、http: //www.phpstudy.net/e/schema/にアクセスしてください。持っている表情で、このウェブサイトの利用シンプルなの。比較を、私はここでそれを使用する方法を紹介しません。以下は、スキーマの規則に従って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="name" type="string" />
    		<attribute name="sex" type="string" />
    		<attribute name="email" type="string" />
    	</complexType>
    </element>
     
    </schema>

3.AbstractSingleBeanDefinitionParserインターフェースを実装します

このインターフェースを実装した後、Springがドキュメントをロードし、定義したタグに遭遇すると、解析メソッドを呼び出してカスタム属性の解析を実行します。

public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser{
    
    
 
	@Override
	protected Class<?> getBeanClass(Element element) {
    
    
		return  User.class;
	}
	
	//从elelment中解析并提取对应的元素
	@Override
	protected void doParse(Element element, BeanDefinitionBuilder builder) {
    
    
	 
		String name=element.getAttribute("name");
		String email=element.getAttribute("sex");
		String sex=element.getAttribute("sex");
		//将提取到的数据放入beanDefinitionBuilder 中,待完成所有的bean解析后统一放到beanfactory
		if(StringUtils.hasText(name)){
    
    
			builder.addPropertyValue("name", name);
		}
		if(StringUtils.hasText(email)){
    
    
			builder.addPropertyValue("email", email);
		}
		if(StringUtils.hasText(sex)){
    
    
			builder.addPropertyValue("sex", sex);
		}
		
	}
	 
}

4.抽象クラスNamespaceHandlerSupportを継承します

タグが定義されています。これがタグプロセッサです。プロセッサは解析クラスの(UserBeanDefinitionParser)インスタンスをSpringに渡すため、Springがタグを解析するときに、インスタンスのメソッドをコールバックできます。

public class MyNamespaceHandler extends NamespaceHandlerSupport {
    
    

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

}

5. spring.handlersファイルとspring.schemasファイルを変更(追加)します

これら2つのファイルのデフォルトのパスは、spring-aopのMETA-INFのパスの下にあります。

http\://www.lexueba.com/schema/user(カスタマイズ)=net.itaem.handler.MyNamespaceHandler

spring.schemasファイルの内容を変更し、以下を追加します

http\://www.lexueba.com/schema/user.xsd(カスタマイズ)=org/springframework/beans/factory/xml/use.xsd

変更後、カスタムタグを使用すると、これらはxsi:schemaLocationに追加され、Springはxsdファイルとハンドラーを単独で検索します。

6.テスト構成ファイルを作成します

名前空間を使用して独自の定義をxsi:schemaLocation追加してから、対応するコンテンツを追加できる場合は、ラベルの独自の定義を使用できます。

    <?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="beantest" name="whx" email="[email protected]" sex=""/>	
    </beans>

7.テストコードを書く

public class Test {
    
    
	
	public static void main(String[] args) {
    
    
		ApplicationContext context=new ClassPathXmlApplicationContext("net/itaem/source/custom_user.xml");
		User bt=(User) context.getBean("beantest");
		System.out.println(bt);
	}
	 
}

おすすめ

転載: blog.csdn.net/saienenen/article/details/112913461