Spring自定义注解扫描的实现

本文介绍了一种自定义Spring自动扫描注解的方法,并通过具体代码实现了解析过程。主要涉及JewelScanBeanDefaultParser类及JewelRemote、JewelService两个自定义注解,用于后期分布式服务框架自动注解的技术支持。

 目标:实现自定义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";
	
	
}

 

转载于:https://www.cnblogs.com/maybo/p/5600130.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值