目標:實現自定義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"; }