是否可以对@Resource类型的实例进行基于构造函数的CDI注入?
我有以下课程:
class MyClass {
@Resource
private ManagedExecutorService executorService;
@Inject
private MyService myservice;
}
我想把它转换成这样的东西:
class MyClass {
private final ManagedExecutorService executorService;
private final MyService myservice;
@Inject
MyClass(ManagedExecutorService executorService, MyService myService)
{
this.executorService = executorService;
this.myService = myService;
}
}
这将使类不可变并且更容易进行单元测试。问题是,因为需要通过@Resource注释获得executorService,所以它似乎不能通过构造函数注入。
答案 0 :(得分:0)
这是我最终做的 - 我创建了一个生产者类来管理资源对象:
public class ExecutorServiceProducer {
@Resource
private ManagedExecutorService managedExecutorService;
@Produces
@Managed
public ExecutorService createManagedExecutorService() {
return managedExecutorService;
}
}
我创建了这个自定义注释:
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Managed {
}
然后我能够按如下方式注释我的课程:
class MyClass {
private final ExecutorService executorService;
private final MyService myservice;
@Inject
MyClass(@Managed ExecutorService executorService, MyService myService)
{
this.executorService = executorService;
this.myService = myService;
}
}
这样我可以通过提供自己的ExecutorService(非容器管理)实例来对该类进行单元测试。