gpt4 book ai didi

java - 我是否需要通过 CDI 中的生产者进行所有对象实例化

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

我刚刚启动了一个 CDI 项目。在这个项目中,Beans2 被注入(inject)到 Beans1 中。但是 Beans2 有一个创建文件的方法。此方法实例化文件对象,如下所示:

new File('myPathFile');

由于此实例化不受 CDI 容器管理,因此 Bean2 不会注入(inject)到 Beans1 中。我尝试让生产者将文件注入(inject)到 Beans2 中,但是我需要对我将使用的所有 java 基类执行相同的操作吗?

是否有另一种解决方案可以简单地使用不需要注入(inject)的类?

Bean1:

@Dependant
public class Bean1 implements Serializable {
private @Inject @Bean2Producer Bean2 bean2;

public void someMethod() {
bean2.foo();
}
}

Bean2:

@Dependant
public class Bean2 extends AbstractClass implements Serializable {

private @Inject @PathDir String pathDir;


public Bean2(String param1, boolean param2) {
super(param1, param2);
}

public void foo() {
File file = new File(pathDir);
}
}

pathDir 制作者:

@ApplicationScoped
public class ProjectProducer implements Serializable {
@Produces
@PathDir
public String getPathDir() {
try {
return PropsUtils.geetProperties().getProperty(PATH_DIR);
} catch (Exception e) {
e.printStackTrace();
}
}
}

PathDir 注释:

@Qualifier
@Target({FIELD, METHOD, PARAMETER, CONSTRUCTOR, TYPE})
@Retention(RUNTIME)
@Documented
public @interface PathDir {}

在此示例中,如果在 foo() 方法中调用 new File,则 PathDir 不会被注入(inject)。

最佳答案

Bean2 没有注入(inject)到 Bean1 中的原因是 Bean2 中没有合适的构造函数以便 CDI 可以自动创建它的实例。 Bean 需要有一个不带参数的构造函数或一个注入(inject)所有参数的构造函数,请参阅 Java EE tutorial 来了解更多信息。

这就是 CDI 的简单限制。如果要将参数传递给 bean,则需要提供一个 setter 方法来在注入(inject) bean2 后传递参数。或者,如果您在对象创建期间需要一些值(因为抽象父级需要它们),则需要注入(inject)所有构造函数参数,如下所示(@Param1@param2 是限定符):

public Bean2(@Inject @Param1 String param1, @Inject @Param2 boolean param2) {
super(param1, param2);
}

或者,您不需要将每个对象都转换为 CDI bean,特别是当您对构造函数参数有要求时。创建 bean 后,您可以手动注入(inject)所有依赖项。这意味着你确实在Bean2中使用了@Inject,但提供了一个setter方法,注入(inject)到bean1中并在bean1的postconstruct方法中设置值,示例如下:

Bean1:

@Dependant
public class Bean1 implements Serializable {

private @Inject @PathDir String pathDir; // inject pathDir here instead of in Bean2

private Bean2 bean2; // without inject, created in init()

@PostConstruct
public void init() {
bean2 = new Bean2("param1", "param2");
bean2.setPathDir(pathDir); // set injected value manually
}

public void someMethod() {
bean2.foo(); // here bean2.pathDir should be already initialized via setPathDir in init() method above
}
}

Bean2:

@Dependant
public class Bean2 extends AbstractClass implements Serializable {

private String pathDir;

public Bean2(String param1, boolean param2) {
super(param1, param2);
}

public void setPathDir(String pathDir) {
this.pathDir = pathDir;
}

public void foo() {
File file = new File(pathDir);
}
}

或者更好的是,合并 setPathDir 和 Bean2 构造函数 - 很明显,pathDir 是 Bean2 必需的依赖项。

关于java - 我是否需要通过 CDI 中的生产者进行所有对象实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32477097/

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