gpt4 book ai didi

java - 使用CDI动态加载Bean - EJB3

转载 作者:行者123 更新时间:2023-12-01 18:36:25 24 4
gpt4 key购买 nike

我在应用程序中使用 EJB3,我想知道我可以根据某些参数在运行时动态注入(inject) bean 吗?

因为我有一个 @Local 接口(interface),它扩展了几个以不同方式工作的 bean。所以在运行时我想根据逻辑加载每个bean。到目前为止,我使用了通常的 JNDI 查找,但我想使用 @Inject 来完成。有没有一种方法可以动态注入(inject) bean?

这是我现有的查找代码。我在此处将 bean 名称传递为 jndi 并动态构建实例。

IService bean = (IService) initialContext.lookup(jndi+"Bean/local"); 
bean.initializeTimer(firstDate, period, request);
<小时/>

更新

我现在有三颗 bean 。
第一个 bean 是 SingleServiceBean

 @Stateless
public class SingleServiceBean implements IService{

@Override
public void doSomething (){
log.debug("inside do something");
}

private final Log log = LogFactory.getLog(SingleServiceBean.class.getName());
}

第二个 bean 是PeriodicService

 @Stateless
public class PeriodicServiceBean implements IService{

@Override
public void doSomething (){
log.debug("inside do something");
}

private final Log log = LogFactory.getLog(PeriodicServiceBean.class.getName());
}

第三个 bean

 @Stateless
public class AsyncServiceBean implements IService{

@Override
public void doSomething (){
log.debug("inside do something");
}

private final Log log = LogFactory.getLog(AsyncServiceBean.class.getName());
}
<小时/>

第二次更新

预选赛:

 @Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Services {
String type();

}

注释文字

 public class ServiceQualifier extends AnnotationLiteral<Services> implements Services{

private static final long serialVersionUID = 6471734834552932687L;
private String type;

public String TypeQualifier(String t) {
this.type = t;
return type;
}

public String type() {
return type;
}
}

新的 bean 类如下所示

 @Services(type = "SingleService" )
@Stateless
public class SingleServiceBean implements IService{
.....
}

然后我在我的 bean 调用者类中添加以下几行

 @Inject
private Instance<IService> iServiceInstance;

public void someMethod() {

// this line gives me error by red underline in .select(...)
IService service = iServiceInstance.select(new ServiceQualifier().TypeQualifier("SingleService")).get();
}

我在 eclipse 中遇到错误:“实例类型中的方法 select(Annotation...) 不适用于参数(字符串)”

最佳答案

假设您使用本地接口(interface),则需要在 CDI(而不是 JNDI 位置)中使用限定符。在您的实现上,执行如下操作:

@Local
@Stateless
@MyQualifier("someValue")
public class MyServiceOne implements IService {
...
}

其中 MyQualifier 可以具有任何值 - 甚至是 JNDI 名称。然后当您想解决它时,请执行以下操作:

@Inject @Any
private Instance<IService> iServiceInstance;

...

IService service = iServiceInstance.select(new MyQualifierLiteral("someValue")).get();

MyQualifierLiteral 这里是一个实现 MyQualifierAnnotationLiteral。它应该是这样的:

import javax.enterprise.util.AnnotationLiteral;

public class MyQualifierLiteral extends AnnotationLiteral<MyQualifier> implements MyQualifier {

private final String value;

public MyQualifierLiteral(final String value) {
this.value = value;
}

@Override
public String value() {
return this.value;
}

}

关于java - 使用CDI动态加载Bean - EJB3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21813720/

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