CDI 拦截器和装饰器仅适用于由 CDI 容器实例化的 bean。
但是,有一个丑陋的解决方法。这有点技术性,但请耐心等待。我写这篇文章主要是在没有 IDE 的情况下写的,所以对于拼写错误等我深表歉意,这只是为了给你一个想法。
首先你需要创建一个限定符
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER})
public @interface InjectionParameter {
int value();
}
然后你需要像这样注释你的特殊构造函数:
@Inject
public MyClass(@InjectionParameter(1) Object firstParam, @InjectionParameter(2) Object secondParameter)
那么对于你的制片人你说
@Inject
private Instance<MyClass> myClassInstance;
@Produces
@InjectionParameter(1)
Object firstParam;
@Produces
@InjectionParameter(2)
Object secondParam;
@Produces MyClass producer() {
firstParam = null; /* set your first param here */
secondParam = null; /* set your second param here */
return myClassInstance.get();
}
请注意,我对 Object 的使用只是一个示例,请替换为您自己的实际类型 :)
关键是CDI容器可以实例化没有默认构造函数的bean,只要正确的构造函数用@Inject注释并且每个参数都是一个有效的注入目标。
我在那里做的是通过生产者字段设置你的bean的参数。
请注意,我实际上并未使用 CDI 容器对此进行测试,因此您可能需要对解决方案进行微调。您最终可能会在生产者方法和 bean 本身之间得到不明确的 bean 解析,您可以通过在 bean 和生产者类的实例字段中放置另一个限定符来解决这个问题。
希望这会有所帮助。
-Juuso