zoukankan      html  css  js  c++  java
  • 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";
    	
    	
    }
    
  • 相关阅读:
    Swing中的并发使用SwingWorker线程模式
    使用批处理打二次开发包
    【转】批处理删除SVN文件
    EAS BOS ORMapping的研究
    EAS BOS ORMapping 元数据解析示例
    ORMapping学习
    EAS BOS数据查询默认会查分录的分析
    【Oracle】常用查询
    KDTable公式解析提示信息设置
    【转】Swing多线程编程
  • 原文地址:https://www.cnblogs.com/maybo/p/5600130.html
Copyright © 2011-2022 走看看