如何在CDI AfterDeploymentValidation生命周期事件期间实例化bean并将参数传递给bean?

时间:2015-04-04 16:53:55

标签: java java-ee cdi

我正在处理CDI扩展,该扩展需要填充HashMap所有已发现的具有特定注释的bean,然后在AfterDeploymentValidation生命周期事件期间实例化@ApplicationScoped bean并将HashMap传递给新实例化的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并传递{{ 1}}到这个bean。

理想情况下,我不希望使用反射来扫描注释。

如何实例化一个特定bean并将HashMap传递给此bean?或者,这样可以在不使用反射的情况下获得相同结果的更好方法吗?

2 个答案:

答案 0 :(得分:1)

为什么需要急切地实例化bean?

您有两种选择:

  1. 将扩展名注入bean中,然后使用HashMap
  2. E.g。

    @Inject
    public MyAppScopedBean(MyExtension extension) {
        this.someHashMap = extension.getHashMap();
    }
    
    1. HashMap传递给生产者方法,为HashMap提供注入支持。
    2. 如果你真的想自己实例化bean,你本质上是试图打破DI的概念。

答案 1 :(得分:0)

如果可以选择运行时扫描,您可能需要查看https://code.google.com/p/reflections/ 它提供了一个简单而强大的API。

否则请看一下这个链接。 16.10中的示例非常相似,因为在示例中,bean的值由扩展名设置。您可以调整示例以将hashMap设置为应用程序范围的bean。你可以简单地使用像这样的观察者方法

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

并将映射设置为包装的InjectionTaget实现中的bean。

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