Spring 当取消选择 "Add variable attributes to class files" 时,@Autowired by name 停止工作

Spring @Autowired by name stops working when "Add variable attributes to class files" is deselected

在我们的应用程序中,我们按名称使用@Autowired。

@Autowired
    public AlertSearchEndpoint(AlertSearchService alertSearchServiceImpl, AlertSearchService alertSearchServiceImpl_v4, AlertSearchService alertSearchServiceImpl_v5) {
        super();
        this.theService = alertSearchServiceImpl;
        this.theService_v4 = alertSearchServiceImpl_v4;
        this.theService_v5 = alertSearchServiceImpl_v5;...

这对我们来说效果很好,但在 Eclipse 中,当我们关闭编译器设置 (-g?) "Add variable attributes to generated class files" 它停止工作。

我们公司出于某种奇怪的原因想要关闭它。有没有办法不使用“@Qualifier”来解决这个问题?如果必须添加此注释,我们将需要进行大量代码更改。

我有哪些选择,为什么会停止工作?

-g:vars 编译器选项旨在保留字节码中的局部变量名称,以便在运行时您将能够找到 alertSearchServiceImplalertSearchServiceImpl_v4 等变量名称。

当您注入多个相同类型的变量时,spring 需要确定哪个是哪个,并且它依赖于此信息(如果可用)。

否则,无法区分这三个方法参数,因为只有类型信息可用(并且它们都是同一类型)——也就是说,除了显式绑定特定的方法外别无他法带有 @Qualifier 注释的 bean。

一个(在我看来是错误的!)解决这个问题的方法是在没有显式限定符的情况下编写自己的 AutowireCandidateResolver 实现,它依赖于参数位置(并假设第一个参数应该是版本 X ,第二个应该是版本 Y,依此类推)。但这太容易出错了,我永远不会冒险。

至于用限定符注释所有参数,即使它是一个大型代码库,我认为您可以提出一些正则表达式,然后 "find and replace" 所有这些参数及其注释版本。