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";
    	
    	
    }
    
  • 相关阅读:
    linux系统中split命令
    linux系统 如何提取奇数列
    R语言提取奇数行、偶数行、整倍数行、奇数列、偶数列、整倍数列
    linux 系统sed命令如何提取奇数行、偶数行及整倍数行
    linux系统如何提取奇数列
    Can't exec "epstopdf": No such file or directory 报错解决
    beagle 填充 Exception in thread "main" java.lang.IllegalArgumentException: NaN
    sh: gnuplot: command not found 报错记录
    linux 系统 awk命令提取奇数行、偶数行及整数倍行
    R语言subset函数的用法
  • 原文地址:https://www.cnblogs.com/maybo/p/5600130.html
Copyright © 2011-2022 走看看