【问题标题】:Cdi constructor injection ejbcdi构造函数注入ejb
【发布时间】:2026-01-03 11:30:01
【问题描述】:

我下载了 intelliJ,它给了我一个建议,将我的注入放在构造函数中。但是,在执行他们的建议时,我还有一条建议消息告诉我我需要一个空的构造函数。所以我想知道实现这样的事情的最佳方法是什么:

这只是 jsf 应用程序中每分钟运行一次的后台任务。

@Singleton
public class MatchesBgService implements Serializable {
    @Inject //intelliJmessage : Hey, you should use constructor injection
    private MatchLookup ml;
    @Inject
    private MatchTask bgTask;

    public MatchesBgService(){
        comparator = new MatchComparator();
    }

    @Schedule(hour = "*", minute = "*/1", second = "20", persistent = false)
    public void gettingMatches() {

【问题讨论】:

  • @BalusC 导入错误,不是架构问题。
  • @BalusC 提供的信息表明这不是架构问题

标签: java dependency-injection cdi


【解决方案1】:

您的代码可能如下所示:

@Singleton
public class MatchesBgService implements Serializable {

    private final MatchLookup ml;
    private final MatchTask bgTask;

    @Inject
    public MatchesBgService(MatchLookup ml, MatchTask bgTask){
        this.ml = ml;
        this.bgTask = bgTask;

        // ...
    }
}

解答你的疑惑:

  1. 在有意义的地方使用构造函数注入被认为是一种很好的做法。
  2. CDI 规范说您需要一个默认的空构造函数(具有可代理的类)。
    但幸运的是,至少 Weld 不需要它——所以我上面的代码会 工作得很好。

这就是 IntelliJ 为您提供这些建议的原因。
干杯

【讨论】:

  • 必须将单例的导入更改为不是 ejb 中的 oine