是否可以在@RequiredArgsConstructor(onConstructor = @__(@Autowired)) 中添加限定符?

Is it possible to add qualifiers in @RequiredArgsConstructor(onConstructor = @__(@Autowired))?

如果我想在构造函数依赖注入中使用注解 @Qualifier,我会得到如下内容:

public class Example {

    private final ComponentExample component;

    @Autowired
    public Example(@Qualifier("someComponent") ComponentExample component) {
        this.component = component;
    }
}

我知道 Lombok 的注释可以减少样板代码并且不必包含构造函数,如下所示:@RequiredArgsConstructors(onConstructor=@__(@Inject)) 但这仅适用于没有限定符的属性。

有人知道是否可以在 @RequiredArgsConstructor(onConstructor = @__(@Autowired)) 中添加限定词吗?

编辑:

最终可能这样做!您可以像这样定义服务:

@Service
@RequiredArgsConstructor
public class SomeRouterService {

   @NonNull private final DispatcherService dispatcherService;
   @Qualifier("someDestination1") @NonNull private final SomeDestination someDestination1;
   @Qualifier("someDestination2") @NonNull private final SomeDestination someDestination2;

   public void onMessage(Message message) {
       //..some code to route stuff based on something to either destination1 or destination2
   }

 } 

前提是你的项目根目录下有这样的lombok.config文件:

# Copy the Qualifier annotation from the instance variables to the constructor
# see https://github.com/rzwitserloot/lombok/issues/745
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier

这是最近在最新的 lombok 1.18.4 中引入的,我在我的博文中写过,我很自豪地说我是推动该功能实现的主要推动力之一。

您可以使用 spring 技巧来限定字段,方法是使用没有 @Qualifier 注释的所需限定符命名它。

@RequiredArgsConstructor
public class ValidationController {

  //@Qualifier("xmlFormValidator")
    private final Validator xmlFormValidator;

我没有测试接受的答案是否有效,但我认为更简洁的方法是将成员变量重命名为您想要限定的名称,而不是创建或编辑 lombok 的配置文件。

// Error code without edit lombok config
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class Foo {
    @Qualifier("anotherDao") UserDao userDao;
}

只需删除@Qualifier 并更改变量的名称

// Works well
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class Foo {
    UserDao anotherDao;
}