Namespace -Unterstützung
Um den Namespace -Support implementieren zu können, muss sie von NamespaceHandlersupport geerbt werden.
paket com.codestd.spring.cxf.config.schema; import org.springframework.beans.factory.xml.namespaceHandlersupport; 1.0.0*/public class WebServiceAnnotationNamespaceHandler extends NamespaceHandlerSupport {@Overridepublic void init() {// TODO Auto-generated method stubthis.registerBeanDefinitionParser("annotation-endpoint", new AnnotationBeanDefinitionParser(EndpointBeanProcessor.class));}}Verwenden Sie die RegisterBeANdeFinitionParser -Methode, um die dem Spring hinzugefügte Konfigurationsunterstützung zu erläutern. Annotation-Endpunkt ist ein Element, das durch Konfiguration unterstützt wird. AnnotationBeanDeFinitionParser ist eine Klasse, die die Konfiguration übernimmt. EndpointbeanProcessor ist eine Klasse, die die beannotierte @endpoint verarbeitet und später ausführlich beschrieben wird.
Verarbeitungskonfiguration
BeandefinitionParser implementieren
Paket com.codestd.spring.cxf.config.schema; import org.springframework.beans.factory.config.beandefinition; organ. endgültige Klasse <?> BeanClass; public AnnotationBeAndeFinitionParser (Klasse <?> BeanClass) {this.beanclass = beanclass;}@oversidepublic beandefinition parse (Elementelement, ParsereContext ParsereContext) {RootbeandeFinition Beandefinition = New New New, newndefinition = newn Newsnition = New New Newontext) {RootbeandeFinition Beandefinition = New New New, Newdefinition = New Newnoderition = New Newnodefinition = New New Newontext) {{rootbeandefinition beandefinition = newnredefinition = newnredefinition = newn News Newdefinition = newn Newsnition = newnredefinition = newn Newsnoderition = newnredefinition = newn Newsnoderication Rootbeandefinition (); beandefinition.setBeanClass (BeanClass); beandefinition.setLazyInit (false); String id = element.getAtTribute ("id"); if (id == null || id.length () == 0) {String name = element. id = beanclass.getName ();} if (parserContext.getRegistry (). EnthältBeAndeFinition (id)) {Neue IllegalStateException ("Duplicate Spring Bean ID" + id);} parsereContext.getRegistry (). RegisterBeanDeFinition (id, beandefinition); element.getAttribute ("paket"); if (! Stringutils.isempty (AnnotationPackage)) beandefinition.getPropertyValues ().Die Anwendung von BeanDefinitionParser finden Sie in der offiziellen Frühlingsdokumentation.
Bohnenregistrierungswerkzeugklasse
Paket com.codestd.spring.cxf.config; import org.springframework.beans.beansexception; import org.springframework.bean.factory.config.beanDefinition; import org.springFramework.bean.factory.support.BeanDeFeFinitionBuwerpertor. org.springFramework.beans.factory.support.beandeFinitionRegistry; import org.springFramework.context.ApplicationContext; import org.springFramework.context.ApplicationContextaware; Muss den Spring ApplicationContext injizieren. oder applicationContext) {this.setApplicationContext (applicationContext);} public beandefinition Register (Klasse <?> Clazz) {if (configurableApplicationContext == null) return null; beandefinitionregistry beandefinitonregistry = (BeanDefinitionRegistry) configurableApplicationContext.getbeanfactory (); Beandefinitionbuilder Beandefinitionbuilder = this.createbuilder (Clazz); Beandefinition beandefinition = BeanDefinitionbuilder.getRawbeandefinition (); Beandefinitonregistry.registerBeanDeFinition (clazz.getName (), BeanDefinition return beandefinition;} private BeanDefinitionBuilderBuilder (Klasse <> clazz) {BeanDefinitionBuilderBuilder (? BeanDefinitionBuilder.genericbeandefinition (Clazz); Return BeanDefinitionBuilder;}}Verarbeitung @endpoint
Paket com.codestd.spring.cxf.config; import org.springframework.beans.beansexception; Import org.springframework.bean.factory.Disposableable; organ. org.springFramework.context.annotation.classPathbeandeFinitionScanner; import org.springFramework.core.type.Filter.AnnotationTypeFilter; Jaune (Wangchengwei)* @Since 1.0.0*/Public Class EndpointBeanProcessor implementiert BeanfactoryPostProcessor, DisposableBean, BeanPostProcessor, ApplicationContextaware {private endgültige String comma_Split_PatterNn = "private applicationContextwace; Beanregistry Beanregistry; public void setAnnotationPackage (String AnnotationPackage) {this.AnnotationPackage = AnnotationPackage; if (! Stringutils.isempty (this.AnnotationPackage) this.annotationPackages = this.AnnotationPackage.spaspit (this. setApplicationContext(ApplicationContext applicationContext)throws BeansException {this.applicationContext = applicationContext;this.beanRegistry = new BeanRegistry(this.applicationContext);}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException {if(!this.isMatchPackage(bean))return Bean; Endpoint Endpoint = bean.getClass (). getAnnotation (Endpoint.Class); if (Endpoint! Destroy () löst Ausnahme {}/*** das Paket Match* @param bean* @return*/private boolean ismatchpackage (Objektbean) {if (AnnotationPackages == null || AnnotationPackages.Length === 0) {return true;} String BeanClassName = Bean.GetClass (). oder (AnnotationPackage == NULL || AnnotationPackage.length () == 0) {return;} if (BeanFactory -Instanz der BeanDefinitionRegistry) {Beandefinitionregistry BeanDefinitionRegistry = (BeanDefinitionRegistry) Beanfactory; ClassPathbeandeFinitionScanner (BeanDefinitionRegistry, true); AnnotationTypeFilter filter = new AnnotationTypeFilter (Endpoint.Class); scanner.addincludeFilter (filter); scanner.scan (AnnotationPackages); Annotationsscanning wurde hier implementiert. Anschließend müssen Sie Business Processing -Code in die Postprozessafteritialisierungsmethode schreiben. Nach der Inverteiung bedeutet die Bean erstellt und mit Attributen injiziert worden.
Die Postprozessbeeritialisierung wird hauptsächlich zur Injektion von Eigenschaften bei Bean -Instanziierung verwendet.
Lassen Sie die Frühling Erweiterungen erkennen
Erstellen Sie zunächst Spring.Handler unter Meta-Inf im Klassenpfad, der Inhalt ist wie folgt
http/: //www.codestd.com/schema/std/ws=com.codestd.spring.cxf.config.schema.webserviceAnnotationNameSpaceHandler
Geben Sie in dieser Datei an, welcher Namespace welche Klasse erforderlich ist.
Erstellen Sie dann 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
Geben Sie den Speicherort der SECHMA -Datei an. Spring verwendet die hier formulierte XSD -Datei, um zu überprüfen, ob die Konfiguration korrekt ist.
prüfen
Erstellen Sie eine Schnittstelle
Paket com.codestd.spring.cxf.ws; importieren javax.jws.webservice;/*** @author Jaune (Wang Chengwei)*@Since 1.0.0*/@webservicePublic Interface HelloService {public String syhi (String name);}Implementierungsklasse
Paket com.codestd.spring.cxf.ws; import javax.jws.webservice; import com.codestd.spring.cxf.annotation "HelloServiceendpoint")@webservice (Endpointinterface = "com.codestd.spring.cxf.ws.helloService") public class HelloServiceImples implementiert HelloService {@Overridepublic String Syhi (String Name) {return "Hello"+Name;Testfälle
@Runwith (SpringJunit4ClassRunner.class) @ContextConfiguration (SOLITIONEN = {"CLASSPATH: applicationContext.xml"}) öffentliche Klasse InitializationTest {@Testpublic void test () {}} In der Verarbeitungsklasse gibt es einen Code, der alle Klassen mit @endpoint Annotation druckt. Wenn der Klassenname ausgedruckt ist, bedeutet dies, dass die Konfiguration normal ist.
Testfälle ausführen
Die Konsole kann sehen
Klasse com.codestd.spring.cxf.ws.helloServiceImpl
Durch die Einführung des oben genannten Inhalts wird diese Erweiterung im Grunde genommen realisiert.