Support de l'espace de noms
Pour implémenter la prise en charge de l'espace de noms, il doit être hérité de NamespaceHandlersupport.
package com.codestd.spring.cxf.config.schema; import org.springframework.beans.factory.xml.namespacehandlersupport; import com.codestd.spring.cxf.config.endpointBeanProcessor; / *** Handy Namespace * @Autor Jaune (wang chengwei) * 1.0.0 * / classe publique WebServiceAnnotationNamespaceHandler étend le nomspacehandlersupport {@OverRiDepublic void init () {// TODO GÉNÉRATEUR AUTO-GÉNÉRÉ SUBTHIS.REGISTERBEANDEFINITIONPARSER ("Annotation-Endpoint", New AnnotationBeAnDeFinionPaSer (ENTROINTBOINTBEANPROCTOR.Utilisez la méthode RegisterBeAnDeFinitionParser pour expliquer que la prise en charge de la configuration est ajoutée à Spring. Annotation-Endpoint est un élément pris en charge par la configuration. AnnotationBeAnDefinitionParser est une classe qui gère la configuration. EndPointBeanProcessor est une classe qui traite le bean annoté @endpoint, et sera décrit en détail plus tard.
Configuration de traitement
Besoin de mettre en œuvre du haricot
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.xmll.bandefinter) org.springframework.beans.factory.xml.parsercontex Classe <?> Beanclass; public annotationBeAnDeFinIitionParser (class <?> Beanclass) {this.beanclass = beanclass;} @ overdedepublic beanDefinition parse (élément, newContex RootBeANDefinition (); beanDefinition.setBeANClass (beanclass); beanDefinition.setlazyInit (false); String id = element.getAttribute ("id"); if (id == null || id.length () == 0) {string name = element.getAttribute ("name"); beanclass.getName ();} if (ParserConText.getRegistry (). ContientBeAndeFinition (id)) {Throw New illégalStateException ("Duplicate Spring Bean Id" + id);} PARSERCONText.getRegistry (). RegisterBeANDeFinition (id, BeanDefinition); String AnnotationPackage = element.getAttribute ("package"); if (! stringUtils.isempty (annotationpackage)) beanDefinition.getPropertyValues (). Add ("AnnotationPackage", annotationPackage); return beanDefinition;}}Pour l'application de BeanDefinitionParser, veuillez vous référer à la documentation officielle du printemps.
Classe d'outils d'enregistrement des haricots
package com.codestd.spring.cxf.config; import org.springframework.beans.beansexception; import org.springframework.beans.factory.config.beanefinition; import org.springframework.beans.factory.sport.beanefinitionBuilder; import; org.springframework.beans.factory.support.beAndeFinitionRegistry; import org.springframework.context.applicationContext; import org.springframework.context.applicationContextaware; import org.springframework.context.onfigurableApplicationContext; Doit injecter le printemps ApplicationContext. * @Author Jaune (Wang Chengwei) * @Since 1.0.0 * / classe publique BeanRegistry implémente ApplicationContextAware {APPLICATION PRIVÉE ApplicationContext; Private ConfigurableApplicationContex ApplicationContext; if (applicationContext instanceof configurableApplicationContext) {this.configurableApplicationContext = (configurableApplicationContext) this.applicationContext;}} public beanregistry () {} public beanregistry (applicationcontext applicationContex Clazz) {if (configurableApplicationContext == null) renvoie null; BeanDefinitionRegistry BeanDefinitonRegistry = (BeanDefinitionRegistry) ConfigurableApplicationContex BeanDefinitionBuilder.getRawBeAnDefinition (); BeanDefinitonRegistry.RegisterBeAnDefinition (Cllazz.getName (), BeanDefinition); Return BeanDefinition;} BeanDefinitionBuilder CreateBuilder (Class <?> Cllaz BeanDefinitionBuilder.GenericBeAnDefinition (Clazz); Return BeanDefinitionBuilder;}}Traitement @endpoint
package com.codestd.spring.cxf.config; import org.springframework.beans.beansexception; import org.springframework.beans.factory.disposablebean; import org.springframework.beans.factory.config.beanfactorypostProcessor; importation; org.springframework.beans.factory.config.configurableLlistableBeanFactory; import org.springframework.beans.factory.support.beandefinitionRegistry; import org.springframework.context.applicationcontex 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 * / classe publique EndpointBeanProcessor implémente BeanfactoryPostProcessor, DisposableBean, BeanPostProcessor, ApplicationContextAware {private final String Coma_Split_Pattern = "," PrivateConConset BeanRegistry; public void setannotationPackage (String AnnotationPackage) {this.annotationpackage = annotationPackage; if (! stringUtils.isempty (this.annotationpackage)) this.annotationpackages = this.annotationpackage.split (this.comma_split_pattern);} @ sworson setApplicationContext (applicationContext ApplicationContext) lève BeanSexception {this.ApplicationContext = applicationContex bean.getClass (). getAnnotation (endpoint.class); if (endpoint! = null) {System.out.println (bean.getClass ());} return bean;} @ OverRidepublic Object PostprocessBelfoFerinitialization (Object Bean, String Beanname) Throws Beansexception {return bean;} @ overdepubl Package Match * @param bean * @ return * / private boolean ismatchPackage (objet bean) {if (annotationPackages == null || annotationPackages.length == 0) {return true;} string beanclassName = bean.getClass (). getName (); for (string pkg: annotationPackages) {if (beanclassname. {return true;}} return false;} / *** scan {@link com.codestd.spring.cxf.annotation.endpoint} Annotation * / @ OverRidepublic void PostProcessBeanfactory (ConfigurableLlistableBeanFactory Beanfactory) Throws BeanSesception {if (annotationpackage == Null | == 0) {return;} if (beanfactory instance of BeanDefinitionRegistry) {beanDefinitionRegistry beanDefinitionRegistry = (beanDefinitionRegistry) beanfactory; classpathbeandefinitionScanner Scanner = new ClassPathBeANDefinitionScanner = NewDeregistry, true); annotationtyPefilter Filtter = New AnnotationTypeFilter (endpoint.class); scanner.addincludFilter (filtre); scanner.scan (annotationPackages);}}} La numérisation d'annotation a été mise en œuvre ici. Ensuite, vous devez rédiger du code de traitement commercial dans la méthode post-processe de la réinitialisation. Après l'initialisation signifie que le haricot a été créé et injecté avec des attributs.
Le post-processusBeforesinitialisation est principalement utilisé pour injecter des propriétés lors de l'instanciation du bean.
Laissez le printemps reconnaître les extensions
Créez d'abord Spring.Handlers sous Meta-Inf dans ClassPath, le contenu est le suivant
http /: //www.codestd.com/schema/std/ws=com.codestd.spring.cxf.config.schema.webserviceannotationNamespaceHandler
Dans ce fichier, spécifiez quel espace de noms a besoin de la classe à gérer.
Puis créez le printemps.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
Spécifiez l'emplacement du fichier SECHMA, Spring utilisera le fichier XSD formulé ici pour vérifier que la configuration est correcte.
test
Créer une interface
package com.codestd.spring.cxf.ws; import javax.jws.webservice; / *** @author jaune (wang chengwei) * @Since 1.0.0*/@webservicepublic Helloservice {public String Syhi (nom de chaîne);}Classe d'implémentation
package com.codestd.spring.cxf.ws; import javax.jws.webservice; import com.codestd.spring.cxf.annotation.endpoint; / *** @author jaune (wang chengwei) * @Since 1.0.0 * / @ endpoint (adresse = "Helloservice", id = "HelloserviceEndPoint") @ WebService (endpointInterface = "com.codestd.spring.cxf.ws.hellOservice") public class helloServiceImplt implémente heltoService {@OverRidePublic String syhi (String Name) {return "Hello" + name;}}Cas de test
@Runwith (springjunit4classrunner.class) @contextconfiguration (locations = {"classpath: applicationContext.xml"}) public class inimiitialisationtest {@TestPublic void test () {}} Il y a un morceau de code dans la classe de traitement qui imprime toutes les classes avec @endpoint annotation, donc si le nom de classe est imprimé, cela signifie que la configuration est normale.
Exécuter des cas de test
La console peut voir
classe com.codestd.spring.cxf.ws.helloServiceImpl
Grâce à l'introduction du contenu ci-dessus, cette extension est essentiellement réalisée.