我已经使用 Lombok 工具工作并积极使用了两个月。对于 Java ,我略微熟悉一些。但是,这是我第一次面对这种语言中的以下语法结构:
@RequiredArgsController(onController = @__(@Autowired))
^^^
那是什么意思,它是如何被编译的?
我已经使用 Lombok 工具工作并积极使用了两个月。对于 Java ,我略微熟悉一些。但是,这是我第一次面对这种语言中的以下语法结构:
@RequiredArgsController(onController = @__(@Autowired))
^^^
那是什么意思,它是如何被编译的?
Class<?>[]。
引入了一个有点奇怪的语法:要使用3个onX功能中的任何一个,必须将要应用于构造函数/方法/参数的注释包装在@__(@AnnotationGoesHere)中。要应用多个注释,请使用@__({@Annotation1, @Annotation2})。这些注释本身也可以有参数。
https://projectlombok.org/features/experimental/onX.html
来自Lombok开发人员Roel Spilker的解释:
这样做的原因是javac在解析阶段已经解析注解,并且如果它确定注解无效,则会给出错误。通过使用不存在的注解
@__,它无法确定它是否是伪造的(可能是由注解处理器创建的),并且不会立即给出错误。这给了Lombok时间来完成它的工作并从代码中删除@__。
@__,它不能确定它是否是伪造的(可能是由注解处理器创建的),并且不会立即报错。这给了 Lombok 时间来完成其工作并从代码中删除 @__。 - Roel Spilker@placeholder_annotation 或者 @temp_annotation 或者 @ignore_this_it_is_ephemeral。 - asgs这意味着生成的构造函数(而不是控制器)也将添加@Autowired注解,以便Spring可以发挥其魔力。使用lombok,您可以像这样编写代码
@RequiredArgsConstructor(onConstructor=@__(@Autowired(required=true)))
public class FooController {
private final FooService service;
interface FooService {}
}
而lombok将在编译期间将其转换。
public class FooController {
private final FooService service;
@Autowired(required=true)
public FooController(FooService service) {
this.service = service;
}
}
@__ 被用来克服注解类型限制,因为
@interface MultipleAnnotations {
Annotation[] value();
}
不起作用,因为所有注释的超类型本身并不是注释。
@interface MultipleAnnotations {
Class<? extends Annotation>[] value();
}
不允许在注解中使用参数:@MultipleAnnotations(SomeAnnotation.class)
Class[],并在编译时检查 isAnnotation()。 - OrangeDog@RequiredArgsController(onController = @__(@Autowired))变为@RequiredArgsController(onController_ = @Autowired)。