我正在处理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?或者,这样可以在不使用反射的情况下获得相同结果的更好方法吗?
答案 0 :(得分:1)
为什么需要急切地实例化bean?
您有两种选择:
HashMap
。E.g。
@Inject
public MyAppScopedBean(MyExtension extension) {
this.someHashMap = extension.getHashMap();
}
HashMap
传递给生产者方法,为HashMap
提供注入支持。如果你真的想自己实例化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。