我正在开发一个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?
你有两个选择:
- 将扩展注入bean中,并在其中使用
HashMap
例如
@Inject
public MyAppScopedBean(MyExtension extension) {
this.someHashMap = extension.getHashMap();
}
- 将
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