【问题标题】:CDI on Socket Wildfly or SESocket Wildfly 或 SE 上的 CDI
【发布时间】:2015-01-20 20:27:19
【问题描述】:

我需要在 Web 应用程序中创建一个服务器套接字来监听 Asterisk AGI 请求,但我需要在套接字中启用 CDI 注入,不知道该怎么做。

今天我已经让这个套接字工作得很好,问题是我不能用套接字注入 CDI bean。

例如:

class RequestProcessor implements Runnable
{

private Socket socket;

@Inject
private PhoneService phoneService;

@Override
public void run()
{
  // Do the logic here
}
}

接收请求并发送到池的方法。

ExecutorService pool = Executors.newCachedThreadPool();

ServerSocket server = new ServerSocket(25000);

Socket client = server.accept();

pool.execute(new RequestProcessor(client));

这不是生产代码,这只是一个图解示例!

我无法让@Inject PhoneService phoneService 工作。

【问题讨论】:

  • 当您new 一个对象时,DI 魔法不会自动发生。对象图必须由 DI 系统创建。
  • @MattBall,我知道这一点,这就是为什么我要问一种方法,因为我自己实例化它是行不通的。

标签: java jakarta-ee cdi wildfly wildfly-8


【解决方案1】:

正如我们已经建立的那样,newing RequestProcessor 不会填充 @Inject-annotated 字段,因为 new 完全切断了 DI 系统。所以你需要一种方法来引入它。

您的目标看起来特别重要,因为RequestProcessor 想要一个 DI 提供的依赖项 (phoneService)一个您以编程方式提供的依赖项 (socket)。作为一般规则,我建议不要在可能的情况下将两者混合使用——一旦你使用 DI,它就会像病毒一样传播。让它发生。如果您可以设计您的系统,以便(几乎)为您注入所有内容,这太棒了!

也就是说,你的情况是完全可行的。

看起来你在某个类中有一些方法,这是一个潜在的注入站点。假设这个未知类实际上是由 CDI 创建的,您可以将 @Inject PhoneService 放入该类,然后将其传递给 RequestProcessor 构造函数:

public class SomeClass {

  @Inject
  private PhoneService phoneService;

  private void someMethod() {
    ExecutorService pool = Executors.newCachedThreadPool();
    ServerSocket server = new ServerSocket(25000);
    Socket client = server.accept();
    pool.execute(new RequestProcessor(client, phoneService));
  }
}

或者你可以使用工厂创建RequestProcessor 实例,最终效果基本相同。你可以手写这个工厂,看起来很熟悉:

public class RequestProcessorFactory {
  @Inject
  private PhoneService phoneService;

  public RequestProcessor createNewProcessor(Socket socket) {
    return new RequestProcessor(socket, phoneService);
  }
}

然后将该工厂的一个实例注入到您的类中:

public class SomeClass {

  @Inject
  private RequestProcessorFactory requestProcessorFactory;

  private void someMethod() {
    ExecutorService pool = Executors.newCachedThreadPool();
    ServerSocket server = new ServerSocket(25000);
    Socket client = server.accept();
    pool.execute(requestProcessorFactory.createNewProcessor(client));
  }
}

还有第三种方法,类似于Guice's assisted injection.,如果您提供接口,它实际上只是为您生成工厂实现。据我所知,CDI 不支持这个,但是有at least one CDI extension which does

快乐 DI-ing!

【讨论】:

  • 哦,是的,我的意思是,CDI 运行良好,问题是在套接字中注入 CDI Bean。
  • 刚刚编辑了任务,以便您更好地了解问题。
  • 感谢您的回答!顺便说一句,如果我以编程方式获取 bean,我将尝试使用工厂选项?
  • 我不明白你说的 是什么意思“顺便说一句,如果我以编程方式获取 bean 就可以了?”
猜你喜欢
  • 2016-02-14
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多