如何使用CDI进行方法参数注入?

2022-09-01 22:41:58

是否可以使用 CDI 将参数注入到方法调用中?预期行为类似于现场注射。查找首选生产商并使用产品。

我想做的是:

public void foo(@Inject Bar bar){
  //do stuff
} 

或这个(使用较少混淆的sytax):

public void foo(){
  @Inject 
  Bar bar;
  //do stuff
} 

在这两种情况下,此语法都是非法的。有替代方案吗?如果不是 - 如果可能的话,出于某种原因,这会是一个坏主意吗?

谢谢

编辑 - 我可能使我的要求不够清晰 - 我希望能够直接调用该方法,将变量的初始化留给容器。Jörn Horstmann和Perception的答案表明这是不可能的。bar


答案 1

当容器实例化 Bean 时,将处理 Bean 的注入点,这确实限制了方法级注入的用例数。该规范的当前版本可识别以下类型的方法注入:

初始值设定项方法注入

public class MyBean {
    private Processor processor;

    @Inject
    public void setProcessor(final Processor processor) {
        this.processor = processor;
    }
}

当注入 实例时,处理器实例也将通过其 setter 方法注入。MyBean

事件观察者方法

public class MyEventHandler {
    public void processSomeEvent(@Observes final SomeEvent event) {
    }
}

事件实例直接注入到事件处理方法中(但是,不是使用@Inject注释)

生产者方法

public class ProcessorFactory {
    @Produces public Processor getProcessor(@Inject final Gateway gateway) {
        // ...
    }
}

生产者方法的参数会自动注入。


答案 2

如果你真正想要的不是作为方法的参数(应该由调用者提供),而是每次调用该方法时正确初始化的CDI Bean实例,并完全构造和注入,然后检查

javax.inject.Provider<T>

基本上,首先将提供程序注入类

@Inject Provider<YourBean> yourBeanProvider;

然后,在该方法中,获取一个新实例

YourBean bean = yourBeanProvider.get();

希望这有助于:)


推荐