Spring自定义注解扫描的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Spring⾃定义注解扫描的实现
⽬标:实现⾃定义spring⾃动扫描注解。
主要为后期实现分布式服务框架⾃动注解提供技术⽀持
技术分析:通过配置组件扫描标签使spring解析标签。
1. JewelScanBeanDefaultParser.java
public class JewelScanBeanDefaultParser implements BeanDefinitionParser {
private static final String RESOURCE_PATTERN = "/**/*.class";
private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
public BeanDefinition 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";
}。