基于CDI构造函数的@Resource注入

时间:2017-05-31 22:49:15

标签: java constructor cdi

是否可以对@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,所以它似乎不能通过构造函数注入。

1 个答案:

答案 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(非容器管理)实例来对该类进行单元测试。

相关问题