Jakarta ee 在EJB调用中返回CDIBean引用
JavaEE中是否允许以下内容 我有一个Jakarta ee 在EJB调用中返回CDIBean引用,jakarta-ee,cdi,Jakarta Ee,Cdi,JavaEE中是否允许以下内容 我有一个@Singleton会话bean,它作为注册表工作,并自动发现在整个应用程序中使用的某些策略,如下所示: public interface Strategy { Class<?> supportedType(); } @Singleton public class StrategyRegistry { @Inject private Instance<Strategy> strategies;
@Singleton
会话bean,它作为注册表工作,并自动发现在整个应用程序中使用的某些策略,如下所示:
public interface Strategy {
Class<?> supportedType();
}
@Singleton
public class StrategyRegistry {
@Inject
private Instance<Strategy> strategies;
private Map<Class<?>, Strategy> registry = new HashMap<>();
@PostConstruct
public void startup() {
Iterator<Strategy> it = strategies;
while (it.hasNext()) {
Strategy s = it.next();
registry.put(s.supportedType(), s);
}
}
// return provided strategy to caller
public Strategy strategyFor(Class<?> clz) {
return registry.get(clz);
}
}
见下文
@Qualifier
@Retention(RUNTIME)
@Target({FIELD,METHOD,TYPE,PARAMETER})
public interface StrategyContext {
//Nonbinding and default so that you can have one producer method for all strategies
@NonBinding
Class<?> supportedType() default Object.class;
}
@Singleton
public class StrategyRegistry {
private Map<Class<?>, Strategy> registry = new HashMap<>();
@Inject
void startup(@Any final Instance<Strategy> strategies) {
for(Strategy strategy:strategies)
registry.put(Strategy.supportedType(), Strategy);
}
}
@Produces
@StrategyContext
@ApplicationScoped
public Strategy strategyFor(final InjectionPoint ip) {
final StrategyContext sc = ip.getAnnotated().getAnnotation(StrategyContext.class);
final Class<?> supportedType = sc.supportedType();
return registry.get(supportedType);
}
}
在生产者和注入点上:
注
如果在运行时,策略可能不存在,因此方法可能返回null,然后使用@Dependent而不是@ApplicationScope注释生产者,因此在注入点,不注入原始策略,但是:
@Inject
@StrategyContext(supportedtype=MySupportedType.class)
私有实例策略
...
如果(!strategy.isUnsatisfied()){strategy.get().doSomething();}
我不明白为什么不,因为@Depend(默认范围)是一个伪范围,因此bean管理器不再对bean感兴趣。它的生命周期完全取决于外部bean或其他直接引用它的类-这是一个简单的旧POJO为什么不在需要的位置注入策略,并使其成为@ApplicationScoped/@Singelton?它们在编译时是未知的。然后使用@products,然后进行正常注入。您的建议如下:欢迎,但是上面的代码/用例被大大简化,以显示这个问题中的最小示例。我很清楚编程查找,但由于超出了这个问题范围的原因,“简单”注入在这里不合适,因此我实际上提出了一个非常具体的问题,即是否允许在bean之间共享CDIBean引用。我不明白为什么不允许,因为@Depend(默认范围)是一个伪作用域,因此bean管理器不再对bean感兴趣。它的生命周期完全取决于外部bean或其他直接引用它的类——这是一个普通的老POJOThis对我来说是一个非常优雅的解决方案。
@Qualifier
@Retention(RUNTIME)
@Target({FIELD,METHOD,TYPE,PARAMETER})
public interface StrategyContext {
//Nonbinding and default so that you can have one producer method for all strategies
@NonBinding
Class<?> supportedType() default Object.class;
}
@Singleton
public class StrategyRegistry {
private Map<Class<?>, Strategy> registry = new HashMap<>();
@Inject
void startup(@Any final Instance<Strategy> strategies) {
for(Strategy strategy:strategies)
registry.put(Strategy.supportedType(), Strategy);
}
}
@Produces
@StrategyContext
@ApplicationScoped
public Strategy strategyFor(final InjectionPoint ip) {
final StrategyContext sc = ip.getAnnotated().getAnnotation(StrategyContext.class);
final Class<?> supportedType = sc.supportedType();
return registry.get(supportedType);
}
}
@Stateless
public class MyService {
@Inject
@StrategyContext(supportedType=MySupportedType.class)
private Strategy strategy;
}
@Inject
@StrategyContext(supportedtype=MySupportedType.class)
private Instance<Strategy> strategy
...
if(!strategy.isUnsatisfied()) { strategy.get().doSomething();}