欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring自定义配置Schema可扩展(一)

程序员文章站 2024-03-08 13:54:22
简述 本教程主要介绍如何扩展spring的xml配置,让spring能够识别我们自定义的schema和annotation。 这里我们要实现的功能如下,首先让sp...

简述

本教程主要介绍如何扩展spring的xml配置,让spring能够识别我们自定义的schema和annotation。

这里我们要实现的功能如下,首先让spring能够识别下面的配置。

<std:annotation-endpoint />

这个配置的要实现的功能是,配置完后能够让spring扫描我们自定义的@endpoint注解。并且根据注解自动发布webservice服务。功能未完全实现,作为扩展spring的教程,起一个抛砖引玉的作用。

创建项目

首先需要创建一个java项目,这里使用maven创建一个quickstart项目(普通java项目)。
pom文件内容如下

<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>jaune162@126.com</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>

定义schema

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<xsd:schema xmlns="http://www.codestd.com/schema/std/ws" 
xmlns:xsd="http://www.w3.org/2001/xmlschema"
xmlns:beans="http://www.springframework.org/schema/beans"
targetnamespace="http://www.codestd.com/schema/std/ws"
elementformdefault="qualified"
attributeformdefault="unqualified">
<xsd:import namespace="http://www.springframework.org/schema/beans"/>
<xsd:annotation>
<xsd:documentation><![cdata[ namespace support for the annotation provided by cxf framework. ]]></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><![cdata[ name of bean. insted of id ]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="package" type="xsd:string" use="optional">
<xsd:annotation>
<xsd:documentation><![cdata[ pakeage to scan. ]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:extension>
</xsd:complexcontent>
</xsd:complextype>
</xsd:element>
</xsd:schema>

关于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}注解实现服务暴露的目的。
* <p>扩展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的注解扫描功能。

<?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:std="http://www.codestd.com/schema/std/ws"
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"/>
</beans>

在配置中定义了要扫描的包,不依赖与context的配置。

以上所述是小编给大家分享的spring自定义配置schema可扩展(一),希望对大家有所帮助。