@AliasFor注解

如题所述

顾名思义,@AliasFor表示别名,它可以添加到自定义注解的两个属性上,表示这两个属性互为别名。也就是说,这两个属性其实是同一个含义。

通常所有注解都会有一个属性value,在使用注解时,如果给value进行赋值,默认可以将value省略,如: @RequestMapping(value="name") 就可以写成 @RequestMapping("name") 。

若自定义注解已有一个属性,但是我们想要定义一个能够 描述业务的属性 ,就可以使用@AliasFor与之前已有的属性互为别名。如下代码,name和value就互为别名。

自定义注解@MyComponent继承了注解@Component( 继承了哪个注解,就需要在自定义注解上引入该注解 ),name属性与@Component中的value属性互为别名。

因为我们的自定义注解继承了@Component注解,按理说@MyComponent的作用应该和@Component作用一样,但是 此处有一点特殊 。如果我们的自定义注解中没有采用 value 这个属性,而是定义为其它名称,例如name。spring在初始化扫描bean时并不会像使用@Component注解一样,读取注解中自定义的beanName。示例如下,spring加载UserServiceImpl后生成的beanName并不是“userService”,而是“userServiceImpl”。

查看spring源码,发现spring在生成bean对应的beanName时,会先从注解@Component里获取value对应的名称(@Controller等注解本质上也是@Component,具体解释可以参考本文)。所以在自定义注解中如果将value替换为其它属性name,就无法采用自定义的beanName,只能生成默认的别名也就是类名。因此, 在自定义注解时,最好采用默认的value 。

建议自定义注解将name()修改为value():

org.springframework.context.annotation.AnnotationBeanNameGenerator#isStereotypeWithNameValue

温馨提示:答案为网友推荐,仅供参考