基於Spring可擴充Schema自訂配置(1)
本章主要介紹擴充前的準備工作。
簡述
本教程主要介紹如何擴充Spring的xml配置,讓Spring能夠識別我們自訂的Schema和Annotation。
這裡我們要實現的功能如下,首先讓Spring能夠識別下面的配置。
這個配置的要實現的功能是,配置完後能夠讓Spring掃描我們自訂的@Endpoint註解。並且根據註解自動發布WebService服務。功能未完全實現,作為擴充Spring的教程,起一個拋磚引玉的作用。
建立項目
首先需要建立一個Java項目,這裡使用Maven建立一個quickstart項目(普通Java項目)。
POM檔案內容如下
<code class="hljs xml"><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <groupid>com.codestd</groupid> <artifactid>spring-cxf-annotation-support</artifactid> <version>1.0.0-SNAPSHOT</version> <name>${project.artifactId}</name> <description>使您的項目可以通過註解的方式發布WebService,基於Spring+CXF封裝,無API侵入。</description> <url>https://github.com/CodeSTD/spring-cxf-annotation-support</url> <licenses> <license> <name>The Apache License, Version 2.0</name> <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> </license> </licenses> <developers> <developer> <name>jaune(WangChengwei)</name> <email>[email protected]</email> <roles> <role>developer</role> </roles> <timezone>GMT+8</timezone> </developer> </developers> <scm> <connection> https://github.com/CodeSTD/spring-cxf-annotation-support.git </connection> <developerconnection> https://github.com/CodeSTD/spring-cxf-annotation-support.git </developerconnection> </scm> <properties> <junit.version>4.12</junit.version> <spring.version>4.2.4.RELEASE</spring.version> <cxf.version>3.1.3</cxf.version> </properties> <dependencies> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context</artifactid> <version>${spring.version}</version> </dependency> <dependency> <groupid>org.apache.cxf</groupid> <artifactid>cxf-rt-frontend-jaxws</artifactid> <version>${cxf.version}</version> </dependency> <dependency> <groupid>org.apache.cxf</groupid> <artifactid>cxf-rt-transports-http-jetty</artifactid> <version>${cxf.version}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-test</artifactid> <version>${spring.version}</version> </dependency> <dependency> <groupid>log4j</groupid> <artifactid>log4j</artifactid> <version>1.2.14</version> <scope>test</scope> </dependency> <dependency> <groupid>org.slf4j</groupid> <artifactid>slf4j-log4j12</artifactid> <version>1.7.7</version> <scope>test</scope> </dependency> </dependencies></project></code>定義Schema
<code class="language-xml hljs "><!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%2D%2D%3E--><xsd:schema attributeformdefault="unqualified" elementformdefault="qualified" targetnamespace="http://www.codestd.com/schema/std/ws" xmlns="http://www.codestd.com/schema/std/ws" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:import namespace="http://www.springframework.org/schema/beans"> <xsd:annotation> <xsd:documentation><!--{cke_protected}{C}%3C!%2D%2D%5BCDATA%5B%20Namespace%20support%20for%20the%20annotation%20provided%20by%20cxf%20framework.%20%5D%5D%2D%2D%3E--></xsd:documentation> </xsd:annotation> <xsd:element name="annotation-endpoint"> <xsd:complextype> <xsd:complexcontent> <xsd:extension base="beans:identifiedType"> <xsd:attribute name="name" type="xsd:string" use="optional"> <xsd:annotation> <xsd:documentation><!--{cke_protected}{C}%3C!%2D%2D%5BCDATA%5B%20Name%20of%20bean.%20Insted%20of%20id%20%5D%5D%2D%2D%3E--></xsd:documentation> </xsd:annotation> </xsd:attribute> <xsd:attribute name="package" type="xsd:string" use="optional"> <xsd:annotation> <xsd:documentation><!--{cke_protected}{C}%3C!%2D%2D%5BCDATA%5B%20Pakeage%20to%20scan.%20%5D%5D%2D%2D%3E--></xsd:documentation> </xsd:annotation> </xsd:attribute> </xsd:extension> </xsd:complexcontent> </xsd:complextype> </xsd:element></xsd:import></xsd:schema></code>
關於Sechma的知識此處不再贅述,不會用的小夥伴們需要先去瞭解下。sechma位置在src/main/resources/META-INF/schema/stdws-1.0.xsd。
定義註解
package com.codestd.spring.cxf.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 用於暴露WebService服務,通過在類上加入{@code @Endpoint}註解實現服務暴露的目的。 *
擴充Spring的Bean掃描功能,在Bean上加入此註解後會自動註冊到Spring容器中。 * @author jaune(WangChengwei) * @since 1.0.0 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Endpoint { /** * 此Endpoint在Spring容器中的ID * @return */ String id(); /** * 服務發布的地址,應神略伺服器位址及連接埠號碼和項目路徑 * @return */ String address(); }
在Spring中的配置
開啟“Window”–“Preferences”–“XML”–“XML Catalog”。點擊“Add”,然後在Location中選擇我們上面建立的xsd。“Key type”選擇Namespace Name,key輸入http://www.codestd.com/schema/std/ws/stdws-1.0.xsd。即Sechma中定義的targetNamespace+檔案名稱。
在Spring中加入命名空間,並使用標籤,如下。這裡要用到Spring的註解掃描功能。
<code class="language-xml hljs "><!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%2D%2D%3E--><beans xmlns="http://www.springframework.org/schema/beans" xmlns:std="http://www.codestd.com/schema/std/ws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.codestd.com/schema/std/ws http://www.codestd.com/schema/std/ws/stdws-1.0.xsd"> <std:annotation-endpoint package="com.codestd.spring.cxf.ws"></std:annotation-endpoint></beans></code>
在配置中定義了要掃描的包,不依賴與context的配置。
到此準備工作基本結束。