首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java EE 7中的CDI +托管并发

Java EE 7中的CDI +托管并发
EN

Stack Overflow用户
提问于 2013-11-14 07:35:58
回答 1查看 1.9K关注 0票数 7

我正在实现一个应用程序范围的服务(将进一步注入到JAX-RS/JAX-WS服务或servlet中,这并不重要),它将通过ManagedExecutorService或ManagedThreadFactory产生一些处理。在处理代码(一个可运行的实例)中,我希望使用注入的资源,如EntityManager、DataSource和web服务引用。第一个解决方案是这样的:

代码语言:javascript
复制
@ApplicationScoped
class MyService {

 @Resource private ManagedExecutorService mes;

 public void request(String param) {
  mes.submit(new MyTask(param));
 }

}

class MyTask implements Runnable {
 // constructor skipped
 @Resource private DataSource ds;

 public void run() {
  // do processing
 }

}

在MyTask.run()中,ds字段显示为空。好吧,这是因为MyTask实例不是托管bean,也就是说它不是由DI容器创建的,所以注入对它不可用。让我们将直接实例化更改为上下文实例:

代码语言:javascript
复制
@ApplicationScoped
class MyService {

 @Resource ManagedExecutorService mes;
 @Inject private Instance<MyTask> instance;

 public void request(String param) { // <- no way to pass param to MyTask()!
  mes.submit(instance.get());
 }

}

这可以达到预期的效果。但是,这是实现我想要的东西的正确/最佳方式吗?通常,问题是,如何在运行时按需创建注入/托管实例。此外,在后一种情况下,我无法将任何参数传递给MyTask构造函数-这是否可能,或者我是否必须引入MyTask.setParam()方法来配置MyTask的实例?

EN

回答 1

Stack Overflow用户

发布于 2013-11-14 17:14:52

向构造器传递参数是被CDI规范禁止的-容器只能调用默认的构造器或使用@Inject注释的构造器,参见CDI spec - 3.1.1. Which Java classes are managed beans。所以,是的,你必须在这里介绍setter。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19966675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档