gpt4 book ai didi

java - 依赖注入(inject)和容器类 (java-ee 7)

转载 作者:太空宇宙 更新时间:2023-11-04 11:36:35 24 4
gpt4 key购买 nike

我是 DI 新手,但突然需要在我的 EJB 应用程序中使用它,所以我尝试重新制作它。

该方法包括具有 2 个字段 - 2 个实现的容器类。它可以根据参数与一个或两个实现一起使用。该容器是在单例的方法调用中创建的,但由其他 ejb bean 使用。

这里我需要帮助 - 如何使 SecurityContainer 类与其他 CDI 托管类(ejb beans)正常工作或成为 CDI 托管类?

我给出了一个旧的(非 CDI)代码,它是如何工作的。读取参数并实例化容器:

@Singleton
public class MySingleton {
private static final MySingleton instance = new MySingleton();
private volatile SecurityHelper securityHelper; // container
public void setSecurityHelper(SecurityHelper secHelper){ securityHelper=secHelper; }
public SecurityHelper getSecurityHelper(){ return securityHelper; }
/* now it has some @Inject....*/

public void start(String passwordP, String passwordH)
.....
// application work with one or two implementations of security
if ("P".equals(DbParams.getServerSecurityFlag()))
instance.setSecurityHelper(new SecurityContainer(new SecurityHelperImplP(DbWorkerImpl.getInstance(), ResponseBuilderImpl.getInstance()),
null));
else
instance.setSecurityHelper( new SecurityContainer( new SecurityHelperImplP(DbWorkerImpl.getInstance(), ResponseBuilderImpl.getInstance()),
new SecurityHelperImplH(DbWorkerImpl.getInstance(), ResponseBuilderImpl.getInstance()) ) );
securityHelper.createSecurity(passwordP, passwordH);

这是容器类:

public class SecurityContainer implements SecurityHelper {
private SecurityHelper secPrg;
private SecurityHelper secHard;
public SecurityContainer(SecurityHelper secPrg, SecurityHelper secHard){
this.secPrg=secPrg;
this.secHard=secHard;
}

具体实现现在必须注入(inject) DbWorker 和 ResponseBuilder ejb bean。 SecurityHelperImplH 看起来是一样的。

public class SecurityHelperImplP implements SecurityHelper {
private SecurityPrg securityPrg = null;

private DbWorker ora; // now they are CDI managed
private ResponseBuilder builder;

public SecurityHelperImplP(DbWorker dbworker, ResponseBuilder bld){
this.ora = dbworker;
this.builder = bld;
}

我相信我需要资格赛,也许还需要一名制作人,但无法将这些点联系起来

最佳答案

从表面上看,你可以选择任何一种方式——制作人或预选赛。两者都需要一些重构,对我来说,生产者似乎是一种更顺利的方式。它将允许您检查参数并根据您的需要定制生产者对象( SecurityContainer )。

首先,您的 SecurityContainer 字段需要是一个注入(inject)点,所以添加@Inject :

@Inject
private volatile SecurityHelper securityHelper; // container

注意:请记住删除 setter 方法,当使用 CDI 时,您不需要它。

现在说说我们如何生产它。你的开始工作基本上已经完成了!您所需要做的就是使其成为生产者,设置正确的返回类型并确保参数到位。所以,一步一步:

1)生产者方法参数

生产者方法的所有参数都会自动被视为另一个可注入(inject)源。例如。您将能够@Inject String passwordP )。哎哟,这不会立即起作用,我不知道你如何准确检索这些参数。

2) Produce 方法如何运行

这是 CDI 每次需要创建实例时调用的方法。因此,您必须对SecurityHelper范围做出决定。 。由于这是在 @Singleton 的启动方法中设置一次我想这是在运行时不会改变的东西。在这种情况下,您可能需要 @ApplicationScoped .

3)那么这一切看起来怎么样?

这里的代码应该可以做你想做的事情,假设我没有误解它:

@Produces  // telling CDI this is how it is supposed to create instances of this type
@ApplicationScoped // what scope does the produced bean have?
public SecurityHelper produceSecHelper() {
// TODO add logic to retrieve these params!
String passwordP;
String passwordH;

SecurityHelper result;
// application work with one or two implementations of security
if ("P".equals(DbParams.getServerSecurityFlag()){
result = new SecurityContainer(new SecurityHelperImplP(DbWorkerImpl.getInstance(), ResponseBuilderImpl.getInstance()),
null);
} else {
result = new SecurityContainer( new SecurityHelperImplP(DbWorkerImpl.getInstance(), ResponseBuilderImpl.getInstance()),
new SecurityHelperImplH(DbWorkerImpl.getInstance(), ResponseBuilderImpl.getInstance()));
}
result.createSecurity(passwordP, passwordH);
return result;
}

注意:CDI 将自行调用此方法。您不应该手动执行此操作,即使您这样做,CDI 也不会识别它。

关于java - 依赖注入(inject)和容器类 (java-ee 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43204864/

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