zoukankan      html  css  js  c++  java
  • 【java】【spring】源码分析,@AliasFor互为别名

    在spring中,最常见的一个注解AliasFor

    它的作用就是多个属性互为别名

    package org.springframework.core.annotation;
    
    import java.lang.annotation.Annotation;
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD})
    @Documented
    public @interface AliasFor {
        @AliasFor("attribute")
        String value() default "";
    
        @AliasFor("value")
        String attribute() default "";
    
        Class<? extends Annotation> annotation() default Annotation.class;
    }

    就是说attribute和value的值是一样的,互为别名

    为什么需要互为别名呢?

    原因是当使用注解时,注解有value()属性,不指明具体名称时就默认是value

    我们常见的就是springMVC里面的@RequestMapping

    一般用@RequestMapping("xxx")

    这里默认就是@RequestMapping(value = "xxx")

    看RequestMapping源码,看到value和path是互为别名,如果不是互为别名,那么就要这样写@RequestMapping(path = "xxx")。就会显得很麻烦

    package org.springframework.web.bind.annotation;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import org.springframework.core.annotation.AliasFor;
    
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Mapping
    public @interface RequestMapping {
        String name() default "";
    
        @AliasFor("path")
        String[] value() default {};
    
        @AliasFor("value")
        String[] path() default {};
    
        RequestMethod[] method() default {};
    
        String[] params() default {};
    
        String[] headers() default {};
    
        String[] consumes() default {};
    
        String[] produces() default {};
    }

    这里说明value()并不是注解必须属性,互为别名一般不用两个都赋值,如果两个一起赋值,必须一样不然报错。互为别名一定要设置默认值,而却默认值一定相同

    参考文章:https://blog.csdn.net/wolfcode_cn/article/details/80654730

                      https://zhidao.baidu.com/question/651652368964470565.html

    属性annotation(),指定属性是继承某注解

    当不用此属性时,自定义一个注解,两个属性互为别名,是这样表示

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Configuration
    @interface MyBean {
        @AliasFor("value")
        String beanName() default "";
        @AliasFor("beanName")
        String value() default "";
    }

    当使用此属性时,也可以这样互为别名

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Configuration
    @interface MyBean {
        @AliasFor(value = "value", annotation = Configuration.class)
        String beanName() default "";
        @AliasFor(annotation = Configuration.class)
        String value() default "";
    }

    看Configuration源码

    package org.springframework.context.annotation;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import org.springframework.core.annotation.AliasFor;
    import org.springframework.stereotype.Component;
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface Configuration {
        @AliasFor(
            annotation = Component.class
        )
        String value() default "";
    }
  • 相关阅读:
    毕业设计后续工作目标
    毕业设计第二周每天工作
    毕业设计第二次本周目标
    毕业设计第一周每天工作
    毕业设计第一次本周目标
    MyEclipse在删除文件后servers报错问题解决
    Tomcat问题解决
    MVC设计模式授权第三方登录
    算法评估
    Spark 配置参数
  • 原文地址:https://www.cnblogs.com/xiaostudy/p/12452613.html
Copyright © 2011-2022 走看看