Suporte para namespace
Para implementar o suporte ao namespace, ele precisa ser herdado a partir do nome do nome do suporte de mão -de -nome.
pacote com.codestd.spring.cxf.config.schema; importar org.springframework.beans.factory.xml.namespaceHandlersupport; import com.codestd.spring.cxf.config.endpointbeanProcessor;/*** lindate namesppypace *authorthorthorthorthorthorthorthorthiMiMort.cxf.config.endPoneNune 1.0.0*/public classe webServiceanNotationNamesPaceHandler estende o nome do namespaceHandlersupport {@OverridePublic void init () {// TODO Auto-Gerated Method stubthis.registerBeandEndEfinitionParser ("Anotation-EndPoint", NewNotationBeanDefinConitionParSer ("Anotation-EndPoint", NewNotationBeanDeffinatUse o método RegisterBeanDefinitionParser para explicar o suporte de configuração adicionado à mola. Anotação-EndPoint é um elemento suportado por configuração. AnnoTationBeanDefinitionParser é uma classe que lida com a configuração. O EndPointBeanProcessor é uma classe que processa o feijão anotado @endPoint e será descrito em detalhes posteriormente.
Configuração de processamento
Precisa implementar o BeandEfinitionParser
package com.codestd.spring.cxf.config.schema;import org.springframework.beans.factory.config.BeanDefinition;import org.springframework.beans.factory.support.RootBeanDefinition;import org.springframework.beans.factory.xml.BeanDefinitionParser;import org.springframework.beans.factory.xml.parserContext; importar org.springframework.util.stringutils; importar org.w3c.dom.Element;/*** @author Jaune (wengwei)*@Enition 1.0.0*/ClassationBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDEFDBDEFDEFDBDEFDEFDEFDEFDEFDEFDEFDEFDEFDEFDEFDEFDEFDEFDEFDEFD (WENGWEI) Classe <?> BeansClass; public anoTationBeAndEfinitionParser (classe <?> Beansclass) {this.beanclass = beansclass;}@substituição de excesso de benéus (elemento do elemento, parserContext parserCoTxt) {rootbeanndEnition beandefinition = RootBeandEfinition (); beandefinition.setBeanClass (beansClass); beandefinition.setLazyInit (false); string id = element.getAttribute ("id"); if (id); null || id.length () == 0) {string name = element.yttribute ("names); sen; beansclass.getName ();} if (parserContext.getRegistry (). element.getAttribute ("package"); if (! stringUtils.isEmpty (annotationPackage)) beandEfinition.getPropertyValues (). Add ("AnoTationPackage", AnnoTationPackage); retornar BeandEfinition;}}}Para obter a aplicação do BeandEfinitionParser, consulte a documentação oficial da primavera.
Classe de ferramenta de registro de feijão
pacote com.codestd.spring.cxf.config; importar org.springframework.beans.beansception; importar org.springframework.beans.factory.config.beandEfinition; importância org.springframeworks.beans.actory.suport.beanDefinition; org.springframework.beans.factory.support.beandEfinitionRegistry; importar org.springframework.context.applicationContext; importar org.springframework.context.ApplicationContexe; importação. Deve injetar o Spring ApplicationContext. Beansexception {this.ApplicationContext = ApplicationContext; if (ApplicationContext Instância do ConfigurableApplicationContext) {this.configurableApplicationContext = (ConfigurableApplicationContext) this.ApplicationContext;}} beanRegistry () {} ApplicationContext) {this.SetApplicationContext (ApplicationContext);} Registro público do BeaNDefinition (classe <?> clazz) {if (configurableApplicationContext == NULL) retorna null; beandefinitionRegistry beandefinitonregistry = (BeandEfinitionRegistry) ConfigurableApplicationContext.getBeanFactory (); beandEfinitionbuilder beanndefinitionbuilder = this.createbuilder (clazz); beandefinition beandefinition = beandefinitionbuilder.getrawbeandEfinition (); beandefinitonregistry.registerbeandEfinition (clazz.getname (), beandefinition); retorna beandefinition;} private beandefinitionbuilder (classe <?> clazting) {borderfinition Beandefinitionbuilder.genericBeandEfinition (clazz); retorna beandefinitionbuilder;}}Processando @endpoint
pacote com.codestd.spring.cxf.config; importar org.springframework.beans.beansception; importar org.springframework.beans.factory.disposableBean; importação org.springframework.beanS.Factory.Config.BeanFactoryProcessor; org.springframework.beans.factory.config.configurableListableBeanFactory; importar org.springframework.beans.factory.support.beaNDefinitionRegistry; importação; org.springframework.context.annotation.ClassPathBeanDefinitionScanner;import org.springframework.core.type.filter.AnnotationTypeFilter;import org.springframework.util.StringUtils;import com.codestd.spring.cxf.annotation.Endpoint;/*** @author Jaune (Wangchengwei)* @since 1.0.0*/public class EndPointBeanProcessor implementa BeanFactoryPostProcessor, DisposableBean, BeanPostProcessor, ApplicationContextware {private final String Comma_split_pattern = ",";;;; BeanRegistry BeanRegistry; public void setAnnotationPackage (String AnoTationPackage) {this.annotationPackage = AnoTationPackage; if (! setApplicationContext (ApplicationContext ApplicationContext) lança beansexception {this.applicationContext = ApplicationContext; this.BeanRegistry = New BeanRegistry (this.ApplicationContext);}@SubsteridePublic Object PostprocessaFterinitialization (Bean, string beanname) lança beansexception {if (! this.ismatchpackage (bean)) retornar bean; endint) (endpoint. null) {System.out.println (bean.getclass ());} retornar bean;} @substituir o objeto PostProcessBeLeinitialization (objeto Bean, string beanname) lança beansexception {return bean;} @substertide pborto anuloubring () bEANSOL **l/**l! ismatchpackage (objeto bean) {if (anoTationPackages == null || anoTationPackages.Length == 0) {return true;} string beanclassName = bean.getclass (). false;}/*** Scan {@link com.codestd.spring.cxf.annotation.endPoint} anotação*/@@substituição void pós -ProcessBeanFactory (configurableListableBeanFactory BeanFactory) lança Bansexception {if (ANOTATIONACAGEMAGE = imediatamente {return;} if (instância do BeanFactory de BeandEfinitionRegistry) {BeandEfinitionRecistry beandEfinitionRegistry = (BeandEfinitionRecistry) BeanFactory; ClassPathBeandEfinitionScanner Scanner; AnoTationTyPefilter (endpoint.class); scanner.addincludefilter (filtro); scanner.scan (anotaçãopackages);}}} A varredura de anotação foi implementada aqui. Em seguida, você precisa escrever o código de processamento de negócios no método de pós -processados aterinitialização. Afterinitialização significa que o feijão foi criado e injetado com atributos.
O pós -processamento foreinitialização é usado principalmente para injetar propriedades quando a instanciação do feijão.
Deixe a primavera reconhecer extensões
Primeiro crie primavera. Mandidadores sob meta-inf em ClassPath, o conteúdo é o seguinte
http/: //www.codestd.com/schema/std/ws=com.codestd.spring.cxf.config.schema.weberserviceanNotationNamesPaceHandler
Neste arquivo, especifique qual espaço de nome precisa de qual classe manipular.
Em seguida, crie 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
Especifique a localização do arquivo Sechma, o Spring usará o arquivo XSD formulado aqui para verificar se a configuração está correta.
teste
Crie uma interface
pacote com.codestd.spring.cxf.ws; importar javax.jws.webservie;/*** @author jaune (wang chengwei)*@since 1.0.0*/@@webserviepitbublic interface Heloservice {public string syhi (string name);}Classe de implementação
pacote com.codestd.spring.cxf.ws; importar javax.jws.webservie; importar com.codestd.spring.cxf.annotation.endpoint;/*** @Author Jaune (Wang Chengwei)*@since 1.0.0*/ @endpoint (endereço = "Hellosserice" "HelloserviceEndPoint")@webService (endpointInterface = "com.codestd.spring.cxf.ws.helloservice") classe pública HeloserviceImpl implementa Heloservice {@OverridePublic String string Syhi (Nome) {return "+Name;}}}Casos de teste
@Runwith (springjunit4classrunner.class) @ContextConfiguration (locations = {"ClassPath: ApplicationContext.xml"}) public InitializationTest {@Testpublic void test () {}} Existe um código na classe de processamento que imprime todas as classes com a anotação @endpoint; portanto, se o nome da classe for impresso, isso significa que a configuração é normal.
Execute casos de teste
O console pode ver
classe com.codestd.spring.cxf.ws.helloserviceImpl
Através da introdução do conteúdo acima, essa extensão é basicamente realizada.