gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:41:59 25 4
gpt4 key购买 nike

我正在开发一个 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. 将扩展注入(inject)到 bean 中,并在其中使用 HashMap

例如

@Inject
public MyAppScopedBean(MyExtension extension) {
this.someHashMap = extension.getHashMap();
}
  • HashMap 传递到生产者方法中,为 HashMap 提供注入(inject)支持。
  • 如果您确实想自己实例化 bean,那么您实际上是在尝试打破 DI 的概念。

    关于java - 如何在 CDI AfterDeploymentValidation 生命周期事件期间实例化 bean 并将参数传递给 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29449031/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com