Soporte para el espacio de nombres
Para implementar el soporte del espacio de nombres, debe ser heredado de NamespaceHandlersupport.
paquete com.codestd.spring.cxf.config.schema; import org.springframework.beans.factory.xml.namespaceHandlersupport; import com.codestd.spring.cxf.config.endpointBeanProcessor;/*** manejar namespace* @author jaune (wang chehengwei) WebServiceAnnotationNamesPaceHandler extiende NamespaceHandLersUpport {@OverridePublic Void init () {// TODO Método Generado automático stubthis.RegisterBeanDefinitionParser ("Annotation-enDPoint", New AnnotationBeanDefinitionParser (EndpointBeanProcor.Classs);}Use el método RegistroBeanDefinitionParser para explicar el soporte de configuración agregado a Spring. Annotation-endpoint es un elemento compatible con la configuración. AnnotationBeanDefinitionParser es una clase que maneja la configuración. EndpointBeanProcessor es una clase que procesa el bean anotado @endpoint, y se describirá en detalle más adelante.
Configuración de procesamiento
Necesita implementar beandefinitionParser
paquete com.codestd.spring.cxf.config.schema; import org.springframework.beans.factory.config.beandefinition; importar org.springframework.beans.factory.support.rootbeandefinition; importe org.springframework.beans.xml.beanTeFinEndeFinition; 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 PublicBeanDefinitionParser Paparser beanClass; public anotationBeanDefinitionParser (class <?> beanclass) {this.beanClass = beanClass;}@overridePublic beandefinition parse (elemento elemento, parsercontext en Parsercontex RootbeanDefinition (); beandefinition.setBeanClass (beanClass); beandefinition.setLayAyInit (false); string id = element.getAttribute ("id"); if (id == null || id.length () == 0) {string name = element.getTribute ("name"); if (! beanClass.getName ();} if (parserContext.getRegistry (). ContAnsBeanDefinition (id)) {Throw New IlegalStateException ("Duplicate Spring Bean ID" + ID);} Parsercontext.getRegy element.getAttribute ("paquete"); if (! stringUtils.isEmpty (annotationPackage)) beandefinition.getPropertyValues (). add ("anotationPackage", anotationPackage); return beandefinition;}}}}}}}}}Para la aplicación de BeanDefinitionParser, consulte la documentación oficial de primavera.
Clase de herramienta de registro de frijoles
paquete com.codestd.spring.cxf.config; import org.springframework.beans.beansexception; import org.springframework.beans.factory.config.beandefinition; importar org.springwork.beans.beans.support.beandefinitionbuilder; import org.springframework.beans.factory.support.beandefinitionRegistry; import org.springframework.context.applicationContext; import org.springframework.context.applicationContextAware; importar org.springingwork.context.configureBableAphePlateConteuntee Debe inyectar el Spring ApplicationContext.* @Author Jaune (Wang Chengwei)* @since 1.0.0*/public class BeanRegistry implementa ApplicationContextAWee {private ApplicationContext ApplicationContext; private configuriveApplicationContextExtExtExtationConteX {this.ApplicationContext = ApplicationContext; if (ApplicationContext OnstoneOf ConfiguableApplicationContext) {this.ConfigurableApepePlateContext = (configurureableApplicationContext) this.ApplicationContext;}} public beanRegistry ()} public beanRegistry (ApplicationContext ApplicleContexteText) {this.StetApplicationContexte (applialContexT);} public beandefinition register (class <?> Clazz) {if (configurableApplicationContexT == null) return null; beandefinitionregistry beandefinitionBuilder = this.createBuilder (Clazz); beandefinition beandefinition = beandefinitionBuilder.getrawBeanDefinition (); beandefinitonRegistry.RegisterBeanDefinition (Clazz.getName (), beandefinition); return beandefinition;} private beandefinilereriler (classyeMe <? Clazz) {beandefinitionBuilder beandefinitionBuilder = beandefinitionBuilder.GenericBeanDefinition (Clazz); return beandefinitionBuilder;}}Procesamiento @endpoint
paquete com.codestd.spring.cxf.config; import org.springframework.beans.beansexception; import org.springframework.beanss.factory.disposableBean; import org.springframework.beans.factory.config.beanfactoryPoSccessor; import org. org. jaune (wangchengwei)* @since 1.0.0*/public class EndpointBeanProcessor implementa BeanFactoryPostProcessor, DisposableBean, BeanPostProcessor, ApplicationContextAware {private final String CommA_split_pattern = "," privado ApplicationContext Application Aplication; Private String AnnotationPackage; Private String [] void setAnnotationPackage (String AnnotationPackage) {this.AnnotationPackage = annotationPackage; if (! StringUtils.isEmpty (this.annotationPackage)) this.annotationPackage = this.AnnotationPackage.split (this.CoComA_Split_Pattern);}}} ibirpublicAcationCapAcationContex ApplicationContext) lanza Beansexception {this.ApplicationContext = ApplicationContext; this.BeanRegistry = new BeanRegistry (this.ApplicationContext);}@overRidePublic Object PostProcessAfterInitialization (Object Bean, String BeanName) lanza BeanSexception {if (! this.ismatchPackage (bean)) return bean; punto final = bean.getClass (). getNoToTation (endpoint.class); if (endpoint! = null) {System.out.println (bean.getClass ());} return bean;} @overridePublic Object PostProcessBeForeInitialization (Object Bean, String BeanName) lanza BeanseException {return bean;} @overridePublic void destruir () Exception {}/*** Do el paquete de paquete* @param* @ @ @rurde*/privado boolean bean) {if (annotationPackages == null || annotationPackages.length == 0) {return true;} string beanClassName = bean.getClass (). getName (); for (string pkg: annotationPackages) {if (beanClassName.startswith (pkg)) {return true;}} returns;} com.codestd.spring.cxf.annotation.endpoint} annotation*/@overridePublic void postprocessBeanFactory (configurureableListableBeanFactory beanFactory) lanza BeanSexception {if (annotationPackage == null || annotationPackage.lengther {BeandefinitionRegistry beandefinitionRegistry = (beandefinitionRegistry) beanFactory; classpathBeanDefinitionScanner Scanner = new ClassPathBeanDefinitionScanner (beandefinitionRegistry, true); AnnotationTypeFilter Filter = nuevo AnotationTypeFilter (endpoint.class); Scanner.addincludeFilter (filtro); Scanner.scan (AnnotationPackages);}}} El escaneo de anotación se ha implementado aquí. Luego, debe escribir el código de procesamiento comercial en el método PostProcessAfterInitialization. Después de la inicialización significa que el bean ha sido creado e inyectado con atributos.
La posprocessbeforinitialización se usa principalmente para inyectar propiedades cuando la instanciación de frijoles.
Deje que la primavera reconozca las extensiones
Primero crea spring.handlers bajo meta-inf en classpath, el contenido es el siguiente
http/: //www.codestd.com/schema/std/ws=com.codestd.spring.cxf.config.schema.webserviceannotationnamespaceHandler
En este archivo, especifique qué espacio de nombres necesita qué clase manejar.
Luego crea primavera.
http/: //www.codestd.com/schema/std/ws/stdws-1.0.xsd=metainf/schema/stdws-1.0.xsd=metainf/schema/stdws-1.0.xsd
Especifique la ubicación del archivo SECHMA, Spring usará el archivo XSD formulado aquí para verificar que la configuración sea correcta.
prueba
Crea una interfaz
paquete com.codestd.spring.cxf.ws; import javax.jwss.webservice;/*** @author jaune (wang chengwei)*@since 1.0.0*/@webservicepublicpublic Interface HELLOSERVICE {public String syhi (nombre de cadena);}Clase de implementación
paquete com.codestd.spring.cxf.ws; import javax.jwss.webservice; import com.codestd.spring.cxf.annotation.endpoint;/*** @author jaune (wang chengwei)*@since 1.0.0*/ @endpoint (dirección = "homoservicio", id = "HelloserviceEndpoint")@WebService (endPointInterface = "com.codestd.spring.cxf.ws.helloService") clase pública HelloserviceImpl implementa Helloservice {@OverridePublic String Syhi (name de cadena) {return "Hello"+Name;}}Casos de prueba
@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (ubicaciones = {"classpath: applicationContext.xml"}) Public Class InitializationTest {@TestPublic Void test () {}} Hay un código en la clase de procesamiento que imprime todas las clases con la anotación @endpoint, por lo que si el nombre de la clase se imprime, significa que la configuración es normal.
Ejecutar casos de prueba
La consola puede ver
Clase com.codestd.spring.cxf.ws.helloServiceImpl
A través de la introducción del contenido anterior, esta extensión se realiza básicamente.