是否可以在 @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 多边形内?