名前空間サポート
名前空間サポートを実装するには、namespacehandlerSupportから継承する必要があります。
パッケージcom.codestd.spring.cxf.config.schema; Import org.springframework.beans.factory.xml.namespacehandlersupport; import com.codestd.spring.cxf.config.endpointbeanprocessor; 1.0.0*/public class webserviceannotationnamespacehandlerはnamespacehandlersupport {@overridepublic void init(){// dodo auto-fublic void init(){// stubthis.registerbeandefinitionparser( "annotation-endpoint"、new annotationbinitionspurser(endopite-endpoint ")RegisterBeanDefinitionParserメソッドを使用して、Springに追加された構成サポートを説明します。 Annotation-Endpointは、構成によってサポートされる要素です。 AnnotationBeanDefinitionParserは、構成を処理するクラスです。 EndPointBeanProcessorは、Bean Annotated @Endpointを処理するクラスであり、後で詳しく説明します。
構成の処理
BeanDefinitionParserを実装する必要があります
パッケージcom.codestd.spring.cxf.config.schema; Import org.springframework.beans.factory.config.beandefinition; Import org.springframework.factory.support.RootbeanDefinition; org.springframework.beans.factory.xml.ParserContext;import org.springframework.util.StringUtils;import org.w3c.dom.Element;/*** @author jaune(Wang Chengwei)* @since 1.0.0*/public class AnnotationBeanDefinitionParser implements BeanDefinitionParser {private final class <? rootbeandefinition(); beandefinition.setbeanclass(beanclass); beandefinition.setLazyInit(false); string id = element.getattribute( "id"); if(id == null || id.length()== 0){string name = ement.isedis(!name "); beanclass.getName();} if(parsercontext.getRegistry()。containsbeandefinition(id)){show new IllegalStateException( "spring bean id" + id);} parsercontext.getregistry()。 element.getAttribute( "package"); if(!stringutils.isempty(annotationPackage))beandefinition.getPropertyValues()BeanDefinitionParserの適用については、公式の春のドキュメントを参照してください。
Bean登録ツールクラス
パッケージcom.codestd.spring.cxf.config; Import org.springframework.beans.beansection; import org.springframework.beans.factory.config.beandefinition; Import org.springframework.beans.factory.support.BeanDefinitionBuilder; org.springframework.beans.factory.support.beandefinitionRegistry; Import org.springframework.context.applicationContext; Import org.springframework.context.applicationContextaware; Import org.springframework.context.configurablablaepliceppliceptext; Spring ApplicationContext。 {this.applicationContext = applicationContext; if(applicationContext instance of configureableapplicationContext){this.configurablableaplicationContext =(configureableableapplicationContext)this.applicationContext;}} public beanregistry(){} public beanregistry(AppleationContext applicationContext){this.setApplicationContext(applicationContext);} public beandefinitionレジスタ(class <?> clazz){if(configureableapplicationContext == null)return null; beandefinitionregistry beandefinitonregistristry = (BeanDefinitionRegistry)configureableapplicationContext.getBeanFactory(); beanDefinitionBuilder BeanDefinitionBuilder = this.CreateBuilder(Clazz); BeanDefinition BeanDefinition = BeanDefinitionBuilder.getRawBeanDefinition(); BeanDefinitonRegistry.registerBeanDefinition(clazz.getName()、BeanDefinition); return beandefinition;} private beandefinitionbuilder createbuilder(clazz) BeanDefinitionBuilder.GenericBeanDefinition(Clazz); Return BeanDefinitionBuilder;}}}@endpointの処理
パッケージcom.codestd.spring.cxf.config; Import org.springframework.beans.beansecception; Import org.springframework.beans.factory.disposablebean; Import org.springframework.beans.factory.config.beanfactoryprocesses; Import; org.springframework.beans.factory.config.configurablelistablebeanfactory; Import org.springframework.factory.support.support.support.beandefinitionRegistry; Import org.springframework.context.ApplicationContext; Import.context.context.context.context springframework.context.annotation.classpathbeandefinitionscanner; Import org.springframework.core.type.filter.annotationtypefilter; Import org.springframework.util.stringutils; import com.codestd.spring.cxf.annotation; jaune(wangchengwei)* @since 1.0.0*/public class endpointbeanprocessorは、beanfactorypostprocessor、dasuseablebean、beanpostprocessor、applicationcontextaware {private final string comma_split_pattern = "、"、 "; private string annotationpackage ["; private annotationpackage ["; privatepacktationpackage ["; BeanRegistry; public void setAnnotationPackage(String AnnotationPackage){this.annotationPackage = annotationPackage; if(!stringutils.isempty(this.annotationPackage))this.annotationPackages = this.annotationPackage.split(this.comma_split_split_pitternpublingpublingpuntfubn setApplicationContext(applicationContext ApplicationContext)throws beansexcection {this.applicationContext = applicationContext; this.beanregistry = new BeanRegistry(this.ApplicationContext);}@OverridePublic Object Postprocessafterinitialization(Object Bean、String Beansicception {if(!this.ismatchpackage(bean))return bean; endpoint endpoint = bean.getclass()。getAnnotation(endpoint.class); if(endpoint!= null){system.out.println(bean.getClass();} return bean;}@obuterpublic Object postprocessbeforeIniTialize(beanInitialize) beansexception {return bean;} @overridepublic void destroy()throws exception {}/***パッケージは一致します* @param bean* @return* @return*/private boolean ismatchpackage(object bean){if(annotationPackages == null || annotationPackages.length = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 0) bean.getClass()。getName(); for(string pkg:annotationPackages){if(beanclassname.startswith(pkg)){return true;}} return false;}/*** scan {@link com.codestd.spring.cxf.annotation.endpoint} annotation*/ PostProcessBeanFactory(configureableLelistablebeanFactory BeanFactory)Throws BeanSexception {if(annotationPackage == null || annotationPackage.length()== 0){return;} if(BeanDefinitionRegistryのBeanFactoryインスタンス) (BeanDefinitionRegistry)BeanFactory; ClassPathBeanDefinitionScannerスキャナー= new ClassPathBeanDefinitionScanner(BeanDefinitionRegistry、True); AnnotationTypefilter Filter = new annotationTypefilter(endpoint.class); scanner.addincludefilter(filter); scanner.scan(annotationPackages);}}}}ここで注釈スキャンが実装されています。次に、ポストプロセッアフテリメタル化法でビジネス処理コードを記述する必要があります。 Initializationの後、豆が作成され、属性が注入されたことを意味します。
プロセス後の前項化は、主にビーンのインスタンス時に特性を注入するために使用されます。
Springに拡張機能を認識させます
最初にspring.-infの下にspring.handlersを作成します。コンテンツは次のとおりです
http/://www.codestd.com/schema/std/ws=com.codestd.spring.cxf.config.schema.webserviceannotationnamespacehandler
このファイルで、どの名前空間がどのクラスを処理するかを指定します。
次に、Spring.schemasを作成します
http/://www.codestd.com/schema/std/ws/stdws-1.0.xsd = meta-inf/schema/stdws-1.0.xsd = meta-inf/schema/stdws-1.0.xsd
Sechmaファイルの場所を指定し、Springはここで処方されたXSDファイルを使用して、構成が正しいことを確認します。
テスト
インターフェイスを作成します
パッケージcom.codestd.spring.cxf.ws;インポートjavax.jws.webservice;/*** @author jaune(wang chengwei)*@since 1.0.0*/@webservicepublic interface helloservice {public string syhi(string name);}実装クラス
パッケージcom.codestd.spring.cxf.ws;インポートjavax.jws.webservice;インポートcom.codestd.spring.cxf.annotation.endpoint;/*** @author jaune(wang chengwei)*@since 1.0.0*/ @endpoint = "helloservice" "helloserviceendpoint")@webservice(endpointinterface = "com.codestd.spring.cxf.ws.helloservice")public class helloserviceimplはhelloservice {@overridepublic string syhi(string name){return "hello"+name;}}}}テストケース
@runwith(springjunit4classrunner.class)@contextconfiguration(locations = {classpath:applicationContext.xml "})public class initializationTest {@testpublic void test(){}}}処理クラスには、すべてのクラスを@Endpoint Annotationで印刷するコードがあります。したがって、クラス名が印刷されている場合、構成が正常であることを意味します。
テストケースを実行します
コンソールが表示されます
クラスcom.codestd.spring.cxf.ws.helloserviceimpl
上記のコンテンツの導入を通じて、この拡張機能は基本的に実現されます。