Jakarta ee 在EJB调用中返回CDIBean引用

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;

JavaEE中是否允许以下内容

我有一个
@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();}