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

}
时间: 2024-12-26 17:47:31

Spring自定义注解扫描的实现的相关文章

深入Spring 自定义注解加载和使用

前言 在工作中经常使用Spring的相关框架,免不了去看一下Spring的实现方法,了解一下Spring内部的处理逻辑.特别是开发Web应用时,我们会频繁的定义@Controller,@Service等JavaBean组件,通过注解,Spring自动扫描加载了这些组件,并提供相关的服务.Spring是如何读取注解信息,并注入到bean容器中的,本文就是通过嵌入Spring的Bean加载,来描述Spring的实现方法.完整的例子都在Github上了. 自定义注解 先看一个最简单的例子,在使用Spr

Spring自定义注解实现Controller获取想要的数据

最近看组内一个哥们写了一个HandlerAdapter,能自动获取Http请求里面的Cookie并组装成一个Model来直接使用.觉得很牛逼.因此自己做了一个,特来分享. 原理: 利用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter. 在DispatcherServlet里面定义了: private List<HandlerAdapter> handlerAdapters; 用于

创建spring自定义注解进行自动装配

1.创建自定义注解 1 import org.springframework.beans.factory.annotation.Qualifier; 2 import java.lang.annotation.ElementType; 3 import java.lang.annotation.Retention; 4 import java.lang.annotation.RetentionPolicy; 5 import java.lang.annotation.Target; 6 7 8

spring - 自定义注解

本自定义注解的作用:用于控制类方法的调用,只有拥有某个角色时才能调用. java内置注解 1.@Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: ElemenetType.CONSTRUCTOR   构造器声明 ElemenetType.FIELD   域声明(包括 enum 实例) ElemenetType.LOCAL_VARIABLE   局部变量声明 ElemenetType.METHOD   方法声明 ElemenetType.PACKAGE   包声明

【转】spring 自定义注解(annotation)与 aop获取注解

首先我们先介绍Java自定义注解. 在开发过程中,我们实现接口的时候,会出现@Override,有时还会提示写@SuppressWarnings.其实这个就是Java特有的特性,注解. 注解就是某种注解类型的一种实例,我们可以把它用在某个类上进行标注.下面这张图解释注解都是什么? 上图可以看出注解大体分为三种:元注解,标记注解,一般注解: 这一块其他的我就不多做介绍,我们这里主要说一下如何定义自己的注解,在这之前我们必须了解标准元注解和相关定义注解的语法.元注解的作用就是负责注解其他注解.Jav

SpringMVC拦截器+Spring自定义注解实现权限验证

设计思路 主要针对需要登录后操作的接口进行校验.接入层在对外暴露接口后,网页.APP.第三方等等途径进行访问接口.用户请求首先会被SpringMVC拦截器拦截到,在拦截器里第一步就是需要校验用户的登录身份(由于是分布式系统这里采用的是userId+accessToken方式来校验),登录校验通过之后再进行用户权限校验,此时会自动拦截@AuthValidate注解的method(核心),如果权限校验失败则抛出权限不足异常,否则校验通过之后再执行具体接口并返回结果. 1.自定义注解 1 packag

使用Spring自定义注解生产Http接口描述信息

最近在做一个手机后台项目,使用的是SpringMVC,开发的接口是HTTP接口.在接口写完后需要在网页中吧接口的名称测试地址等信息添加到网页中,感觉这样很麻烦还容易漏.于是就写了一个自定义注解通过注解的方式将接口的描述信息加入到接口中,通过注解描述接口信息并且生产接口测试地址 先看使用方法及最终效果 @ResponseBody @RequestMapping("/getBusWaiting") @AppInterface(value="获取候车信息",group=&

spring --自定义注解(配合@Aspect)

1:首先,声明自定义注解 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface DtTransactional { /* * Whether need to rollback */ public boolean includeLocalTransaction() default true; public boolean confirmMethodExist() default tru

spring mvc 注解扫描问题 ,扫描不到controller, use-default-filters=&quot;false&quot;

今天搭了个spring mvc项目,怎么也扫描不到controller,最后发现问题在use-default-filters="false"上面,乱copy出的问题 (默认值是true,它的作用就是扫描一些相关的注解,包括了@controller,@Component,@Service,@Repository等,) <context:component-scan base-package="com.example" use-default-filters=&q