【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 "";
}
原文地址:https://www.cnblogs.com/xiaostudy/p/12452613.html