2015-04-04 33 views
0

我正在研究一個CDI擴展,它需要用所有發現的bean填充一個HashMap,然後在生命週期事件期間實例化一個@ApplicationScoped bean並將HashMap傳遞給新實例化的bean。如何在CDI AfterDeploymentValidation生命週期事件期間實例化一個bean並將參數傳遞給bean?

使用下面的代碼,我可以找到任何已經使用@CQRSCommandHandler進行註釋的bean,並使用註釋中bean的名稱和參數集填充HashMap

public class CQRSExtension implements Extension { 

    private Map<String, String> discoveredCommandHandlers = new HashMap<String, String>(); 

    public <T> void processAnnotatedType(@Observes @WithAnnotations({ CQRSCommandHandler.class }) ProcessAnnotatedType<T> processAnnotatedType) { 

     AnnotatedType<T> annotatedType = processAnnotatedType.getAnnotatedType(); 

     String commandName = annotatedType.getAnnotation(CQRSCommandHandler.class).command().getName(); 
     String handlerName = annotatedType.getJavaClass().getName(); 

     discoveredCommandHandlers.put(commandName, handlerName); 

    } 
} 

我正在掙扎是我應該如何急切地實例化bean並通過HashMap到這個bean。

我可以找到大量的例子,如這一個(http://ovaraksin.blogspot.co.uk/2013/02/eager-cdi-beans.html)說明如何熱切實例具有特定註釋的bean,但是我不能工作了如何實例化一個特定的bean,並通過一個HashMap到這個bean。

理想情況下,我寧願不使用反射來掃描註釋。

如何實例化一個特定的bean並將HashMap傳遞給此bean?或者,有沒有更好的方法來實現相同的結果而不使用反射?

回答

1

爲什麼你需要急切實例化bean?

你有兩個選擇:

  1. 注入延伸到bean代替,並在那裏使用HashMap

例如,

@Inject 
public MyAppScopedBean(MyExtension extension) { 
    this.someHashMap = extension.getHashMap(); 
} 
  • 通行證HashMap成生產者方法以提供用於注射HashMap支持。
  • 如果你真的想自己實例化bean,你基本上試圖打破DI的概念。

    0

    如果運行時掃描是一種替代方法,您可能需要查看https://code.google.com/p/reflections/ 它提供了一個簡單而強大的API。

    否則看看這個鏈接。 16.10中的例子非常相似,因爲在示例中bean的值由擴展設置。你可以調整這個例子來將hashMap設置到你的應用程序範圍的bean中。你會在簡單地使用觀測方法,這樣

    ApplicationScopedBean void processInjectionTarget(
         @Observes ProcessInjectionTarget<ApplicationScopedBean> pit) { ... 
    

    和地圖設置成你的包裹InjectionTaget實施豆。

    https://docs.jboss.org/weld/reference/latest/en-US/html/extend.html#_wrapping_an_literal_injectiontarget_literal

    相關問題