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



我正在开发一个CDI扩展,它需要用所有发现的具有特定注释的bean填充HashMap,然后在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并将HashMap传递给这个bean。

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

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

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

你有两个选择:

  1. 将扩展注入bean中,并在其中使用HashMap

例如

@Inject
public MyAppScopedBean(MyExtension extension) {
    this.someHashMap = extension.getHashMap();
}
  1. HashMap传递到生产者方法中,为HashMap提供注入支持

如果您真的想自己实例化bean,那么您实际上是在尝试打破DI的概念。

如果运行时扫描是一种选择,您可能需要查看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

相关内容

最新更新