我一直在与Lombok合作并积极使用2个月。使用Java我更熟悉一点。但是,我第一次面对语言中的以下语法结构:
@RequiredArgsController(onController = @__(@Autowired))
^^^
这意味着什么,以及如何编译?
答案 0 :(得分:14)
这是一个实验性的Lombok语法,用于在引用多个注释时支持一个间接层,而不是使用Class<?>[]
。
语法有点奇怪;要使用3
onX
个功能中的任何一个,您必须将注释包装到@__(@AnnotationGoesHere)
中的构造函数/ method /参数中。要应用多个注释,请使用@__({@Annotation1, @Annotation2})
。注释本身也可以显示参数。
https://projectlombok.org/features/experimental/onX.html
来自Lombok开发者Roel Spilker的解释:
原因是javac已经在解析阶段解析了注释,并且如果它可以确定注释是无效的则会给出错误。通过使用不存在的注释
@__
,它无法确定它是否为虚假(它可能由注释处理器创建)并且不会立即给出错误。这使得Lombok有时间完成工作并从代码中删除@__
。
答案 1 :(得分:7)
这意味着生成的构造函数(不是控制器)也会添加@Autowired
注释,以便spring可以发挥其魔力。使用lombok,您可以编写代码,如
@RequiredArgsConstructor(onConstructor=@__(@Autowired(required=true)))
public class FooController {
private final FooService service;
interface FooService {}
}
并且lombok会将其during compilation转换为
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)