首页 > 编程语言 > 详细

【java】【spring】源码分析,@AliasFor互为别名

时间:2020-03-10 00:43:12      阅读:53      评论:0      收藏:0      [点我收藏+]

 

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

 

【java】【spring】源码分析,@AliasFor互为别名

原文:https://www.cnblogs.com/xiaostudy/p/12452613.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!