最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring自定義配置Schema可擴(kuò)展(二)

 更新時(shí)間:2016年01月28日 11:30:50   作者:王成委  
這篇文章主要介紹了Spring自定義配置Schema可擴(kuò)展(二)的相關(guān)資料,需要的朋友可以參考下

命名空間支持

要實(shí)現(xiàn)命名空間支持,需要繼承自NamespaceHandlerSupport。

package com.codestd.spring.cxf.config.schema;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
import com.codestd.spring.cxf.config.EndpointBeanProcessor;
/**
* 處理命名空間
* @author jaune(Wang Chengwei)
* @since 1.0.0
*/
public class WebServiceAnnotationNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
// TODO Auto-generated method stub
this.registerBeanDefinitionParser("annotation-endpoint", new AnnotationBeanDefinitionParser(EndpointBeanProcessor.class));
}
}

通過(guò)registerBeanDefinitionParser方法講配置支持添加到Spring中。annotation-endpoint是配置支持的元素。AnnotationBeanDefinitionParser是處理配置的類(lèi)。EndpointBeanProcessor是處理@Endpoint注解的Bean的類(lèi),后面會(huì)有詳細(xì)的講述。

處理配置

需要實(shí)現(xiàn)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;
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<?> beanClass;
public AnnotationBeanDefinitionParser(Class<?> beanClass) {
this.beanClass = beanClass;
}
@Override
public BeanDefinition parse(Element element, ParserContext parserContext) {
RootBeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClass(beanClass);
beanDefinition.setLazyInit(false);
String id = element.getAttribute("id");
if(id == null || id.length() == 0 ){
String name = element.getAttribute("name");
if(!StringUtils.isEmpty(name)) id = name;
else id = beanClass.getName();
}
if (parserContext.getRegistry().containsBeanDefinition(id)) {
throw new IllegalStateException("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;
}
}

BeanDefinitionParser的應(yīng)用參見(jiàn)Spring官方文檔。

Bean注冊(cè)工具類(lèi)

package com.codestd.spring.cxf.config;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
/**
* Registry Bean. Must inject the spring ApplicationContext.
* @author jaune(Wang Chengwei)
* @since 1.0.0
*/
public class BeanRegistry implements ApplicationContextAware{
private ApplicationContext applicationContext;
private ConfigurableApplicationContext configurableApplicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
if(applicationContext instanceof ConfigurableApplicationContext){
this.configurableApplicationContext = (ConfigurableApplicationContext)this.applicationContext;
}
}
public BeanRegistry(){
}
public BeanRegistry(ApplicationContext applicationContext){
this.setApplicationContext(applicationContext);
}
public BeanDefinition register(Class<?> 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 BeanDefinitionBuilder createBuilder(Class<?> clazz){
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
return beanDefinitionBuilder;
}
}

處理@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;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import 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 implements 
BeanFactoryPostProcessor, DisposableBean, BeanPostProcessor, ApplicationContextAware{
private final String COMMA_SPLIT_PATTERN = ",";
private ApplicationContext applicationContext;
private String annotationPackage;
private String[] annotationPackages;
private BeanRegistry beanRegistry;
public void setAnnotationPackage(String annotationPackage) {
this.annotationPackage = annotationPackage;
if(!StringUtils.isEmpty(this.annotationPackage))
this.annotationPackages = this.annotationPackage.split(this.COMMA_SPLIT_PATTERN);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
this.beanRegistry = new BeanRegistry(this.applicationContext);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
if(!this.isMatchPackage(bean))return bean;
Endpoint endpoint = bean.getClass().getAnnotation(Endpoint.class);
if(endpoint != null){
System.out.println(bean.getClass());
}
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
@Override
public void destroy() throws Exception {
}
/**
* 包是否匹配
* @param bean
* @return
*/
private boolean isMatchPackage(Object bean){
if (annotationPackages == null || annotationPackages.length == 0) {
return true;
}
String beanClassName = bean.getClass().getName();
for (String pkg : annotationPackages) {
if (beanClassName.startsWith(pkg)) {
return true;
}
}
return false;
}
/**
* 掃描{@link com.codestd.spring.cxf.annotation.Endpoint}注解
*/
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
if (annotationPackage == null || annotationPackage.length() == 0) {
return;
}
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry beanDefinitionRegistry = (BeanDefinitionRegistry)beanFactory;
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(beanDefinitionRegistry,true);
AnnotationTypeFilter filter = new AnnotationTypeFilter(Endpoint.class);
scanner.addIncludeFilter(filter);
scanner.scan(annotationPackages);
}
}
}

這里已經(jīng)實(shí)現(xiàn)了注解的掃描。然后需要在postProcessAfterInitialization方法中寫(xiě)業(yè)務(wù)處理代碼。AfterInitialization表示Bean已經(jīng)創(chuàng)建并且注入屬性。

postProcessBeforeInitialization主要是為了在Bean實(shí)例化時(shí)注入屬性。

讓Spring識(shí)別擴(kuò)展

首先在classpath的META-INF下創(chuàng)建spring.handlers,內(nèi)容如下

http\://www.codestd.com/schema/std/ws=com.codestd.spring.cxf.config.schema.WebServiceAnnotationNamespaceHandler

在這個(gè)文件中指明了哪個(gè)命名空間需要哪個(gè)類(lèi)來(lái)處理。
然后再創(chuàng)建spring.schemas

http\://www.codestd.com/schema/std/ws/stdws-1.0.xsd=META-INF/schema/stdws-1.0.xsd

指明了Sechma文件的位置,Spring會(huì)使用這里制定的xsd文件來(lái)驗(yàn)證配置是否正確。

測(cè)試

創(chuàng)建接口

package com.codestd.spring.cxf.ws;
import javax.jws.WebService;
/**
* @author jaune(Wang Chengwei)
* @since 1.0.0
*/
@WebService
public interface HelloService {
public String syHi(String name);
}

實(shí)現(xiàn)類(lèi)

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(address="HelloService", id = "HelloServiceEndpoint")
@WebService(endpointInterface="com.codestd.spring.cxf.ws.HelloService")
public class HelloServiceImpl implements HelloService{
@Override
public String syHi(String name) {
return "Hello "+name;
}
}

測(cè)試用例

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class InitializationTest {
@Test
public void test(){
}
}

在處理類(lèi)中有一段代碼是將有@Endpoint注解的類(lèi)都打印出來(lái),所以如果類(lèi)名被打印出來(lái)就表示配置正常了。

運(yùn)行測(cè)試用例

控制臺(tái)能夠看到

class com.codestd.spring.cxf.ws.HelloServiceImpl

通過(guò)以上內(nèi)容的介紹本次擴(kuò)展基本上就實(shí)現(xiàn)了。

相關(guān)文章

  • 理解 Java 核心基礎(chǔ)精髓解析

    理解 Java 核心基礎(chǔ)精髓解析

    這篇文章主要介紹了解 Java 核心基礎(chǔ)精髓解析問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-03-03
  • java中String的一些方法深入解析

    java中String的一些方法深入解析

    以下是對(duì)java中String的一些方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07
  • 關(guān)于Java中finalize析構(gòu)方法的作用詳解

    關(guān)于Java中finalize析構(gòu)方法的作用詳解

    構(gòu)造方法用于創(chuàng)建和初始化類(lèi)對(duì)象,也就是說(shuō),構(gòu)造方法負(fù)責(zé)”生出“一個(gè)類(lèi)對(duì)象,并可以在對(duì)象出生時(shí)進(jìn)行必要的操作,在這篇文章中會(huì)給大家簡(jiǎn)單介紹一下析構(gòu)方法,需要的朋友可以參考下
    2023-05-05
  • Java如何實(shí)現(xiàn)調(diào)用外部Api

    Java如何實(shí)現(xiàn)調(diào)用外部Api

    這篇文章主要介紹了Java如何實(shí)現(xiàn)調(diào)用外部Api問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java1.8中StringJoiner的使用及源碼詳析

    Java1.8中StringJoiner的使用及源碼詳析

    在看String類(lèi)時(shí),看到有使用StringJoiner類(lèi),所以順便看了下StringJoiner類(lèi),下面這篇文章主要給大家介紹了關(guān)于Java 1.8中StringJoiner的使用及源碼分析的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧
    2018-08-08
  • 如何解決@Valid對(duì)象嵌套List對(duì)象校驗(yàn)無(wú)效問(wèn)題

    如何解決@Valid對(duì)象嵌套List對(duì)象校驗(yàn)無(wú)效問(wèn)題

    這篇文章主要介紹了如何解決@Valid對(duì)象嵌套List對(duì)象校驗(yàn)無(wú)效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java常見(jiàn)面試題及答案匯總

    java常見(jiàn)面試題及答案匯總

    本文提供Java面試題集錦,涵蓋封裝、繼承、多態(tài)等核心概念,旨在幫助求職者全面復(fù)習(xí),提升面試表現(xiàn),從基礎(chǔ)知識(shí)到實(shí)際應(yīng)用,內(nèi)容豐富,適合各類(lèi)求職者,需要的朋友可以參考下
    2024-09-09
  • java處理字節(jié)的常用工具類(lèi)

    java處理字節(jié)的常用工具類(lèi)

    這篇文章主要為大家詳細(xì)介紹了java處理字節(jié)的常用工具類(lèi),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java的棧與隊(duì)列實(shí)現(xiàn)代碼解析

    Java的棧與隊(duì)列實(shí)現(xiàn)代碼解析

    棧是常見(jiàn)的線性數(shù)據(jù)結(jié)構(gòu),棧的特點(diǎn)是以先進(jìn)后出的形式,后進(jìn)先出,先進(jìn)后出,分為棧底和棧頂,棧應(yīng)用于內(nèi)存的分配,表達(dá)式求值,存儲(chǔ)臨時(shí)的數(shù)據(jù)和方法的調(diào)用等,本文給大家介紹Java的棧與隊(duì)列實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧
    2025-04-04
  • 利用Spring Boot操作MongoDB的方法教程

    利用Spring Boot操作MongoDB的方法教程

    mongodb是最早熱門(mén)非關(guān)系數(shù)據(jù)庫(kù)的之一,使用也比較普遍,一般會(huì)用做離線數(shù)據(jù)分析來(lái)使用,放到內(nèi)網(wǎng)的居多,下面這篇文章主要給大家介紹了利用Spring Boot操作MongoDB的方法教程,需要的朋友可以參考下
    2017-05-05

最新評(píng)論

奉贤区| 财经| 岢岚县| 岗巴县| 纳雍县| 全州县| 册亨县| 淄博市| 五常市| 武功县| 玉山县| 南郑县| 奉化市| 德钦县| 通河县| 旺苍县| 皋兰县| 长丰县| 清新县| 波密县| 常州市| 亚东县| 井陉县| 清水河县| 班玛县| 临猗县| 鄱阳县| 商河县| 罗甸县| 荥经县| 青海省| 鄂温| 睢宁县| 岳西县| 屏南县| 铅山县| 宁德市| 胶州市| 双城市| 房山区| 乌鲁木齐市|