2017-05-31 151 views
0

是否有可能做一個@Resource類型的實例的基於構造函數的CDI注入?基於CDI基於構造函數的注入與@Resource

我有下面的類:

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; 
    } 

} 

這將使類不可變的,更容易進行單元測試。問題是,因爲executorService需要通過@Resource註解獲得,所以它似乎不是通過構造函數注入的。

回答

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; 
    } 

} 

這樣我可以通過提供我的單元測試類wn ExecutorService(非容器管理)實例。