java 扫描 注解_Spring自定义注解扫描的实现

标签:

目标:实现自定义spring自动扫描注解。主要为后期实现分布式服务框架自动注解提供技术支持

技术分析:通过配置组件扫描标签使spring解析标签。

1. JewelScanBeanDefaultParser.java

public classJewelScanBeanDefaultParser implements BeanDefinitionParser {private static final String RESOURCE_PATTERN = "/**/*.class";private ResourcePatternResolver resourcePatternResolver = newPathMatchingResourcePatternResolver();publicBeanDefinition parse(Element element, ParserContext parserContext) {

String basePackage= element.getAttribute("base-package");if(StringUtils.hasText(basePackage)) {try{

String pattern= ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +ClassUtils.convertClassNameToResourcePath(basePackage)+RESOURCE_PATTERN;

Resource[] resources=resourcePatternResolver.getResources(pattern);

MetadataReaderFactory readerFactory= new CachingMetadataReaderFactory(this.resourcePatternResolver);for(Resource resource : resources) {if(resource.isReadable()) {

MetadataReader reader=readerFactory.getMetadataReader(resource);

String className=reader.getClassMetadata().getClassName();

Class> clazz =Class.forName(className);

JewelService jewelService= clazz.getAnnotation(JewelService.class);if (null !=jewelService) {

AnnotationBeanDefinitionLoader.load(jewelService, clazz, parserContext);

}

JewelRemote jewelRemote= clazz.getAnnotation(JewelRemote.class);if (null !=jewelRemote) {

AnnotationBeanDefinitionLoader.load(jewelRemote, clazz, parserContext);

}

}

}

}catch(IOException e) {

e.printStackTrace();

}catch(ClassNotFoundException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}return null;

}

}

2. 注解接口定义

JewelRemote.java

@Documented

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface JewelRemote {

public String name() default "";

public String version() default "v_0.0.1";

public String registry() default "registry";

}

JewelService.java

@Documented

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface JewelService {

public String name() default "";

public String version() default "v_0.0.1";

public String registry() default "registry";

}

标签:


版权声明:本文为weixin_33767088原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。