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";
	
	
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM