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

Posted

技术标签:

【中文标题】是否可以在 @RequiredArgsConstructor(onConstructor = @__(@Autowired)) 中添加限定符?【英文标题】:Is it possible to add qualifiers in @RequiredArgsConstructor(onConstructor = @__(@Autowired))? 【发布时间】:2016-11-27 17:27:39 【问题描述】:

如果我想在构造函数依赖注入上使用注解@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)) 中添加限定符吗?

【问题讨论】:

已经在github上提问github.com/rzwitserloot/lombok/issues/745 我也认为,如果注释同时适合构造函数中的实例变量和参数,添加 esp 并不难,就像 @Qualifier 一样。 【参考方案1】:

在我看来

@RequiredArgsConstructor(onConstructor=@__(@Autowired))

也在工作(可能我使用的是较新的龙目岛?)

example code

【讨论】:

我知道它有效:)!但我在问我们是否可以为其添加限定符! :)【参考方案2】:

编辑:

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

@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 中引入的,我在我的博文中写道,我很自豪地说我是推动该功能实施的主要推动力之一。

blog post where the issue is discussed详细介绍 原创issue on github 还有一个小github project to see it in action

【讨论】:

我注意到@Qualifier 部分可以介于private final 和界面之间。我更喜欢这个,因为它使 private final 与自动合格的对应物保持一致。 当然,这只是一个排序和约定的问题,但是正式地你会把注释放在修饰符之前,或者放在单独的一行:***.com/questions/22838634/…【参考方案3】:

您可以使用 spring 技巧通过使用所需的限定符命名字段来限定字段,而无需 @Qualifier 注释。

@RequiredArgsConstructor
public class ValidationController 

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

【讨论】:

如果与@MockBean 一起使用,它将不起作用。 Spring Boot 2.2.5.RELEASE.【参考方案4】:

我没有测试接受的答案是否有效,但我认为不是创建或编辑 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;

【讨论】:

我不认为这是真的,字段名称通常不是人们意识到的会影响应用程序行为的东西,它可能会导致难以检测的神秘问题。 @DavidBarda 从这个角度来看你是对的,谢谢你的评论

以上是关于是否可以在 @RequiredArgsConstructor(onConstructor = @__(@Autowired)) 中添加限定符?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以检测用户是否在新选项卡中打开了链接?

是否可以判断一个对象是否在不同的 AppDomain 中运行?

是否可以使用 JavaScript 确定 GeoJSON 点是否在 GeoJSON 多边形内?

是否可以在 Cocoa 中确定文件是否是从别名打开的?

是否可以检查是否在 iOS 7 中启用了 iCloud KeyChain?

是否可以在接口中实现本机方法?