Jakarta ee 使用CDI和第三方类的DI:避免构造函数为每个代理构造多次调用业务逻辑

Jakarta ee 使用CDI和第三方类的DI:避免构造函数为每个代理构造多次调用业务逻辑,jakarta-ee,dependency-injection,constructor,cdi,application-scope,Jakarta Ee,Dependency Injection,Constructor,Cdi,Application Scope,我对DI的EE/CDI比较陌生,所以也许你们中的一位可以为我的问题提供一些提示: 我有一个第三方类,我想把它注入到其他bean中。在春天,只需要一些声明就可以了。使用cdi,现在需要一个工厂类: public class XProducer { @Produces @ApplicationScoped public X createX(){ return new X(); } } 令人遗憾的是,X的构造函数调用相当昂贵的业务逻辑,每次由c

我对DI的EE/CDI比较陌生,所以也许你们中的一位可以为我的问题提供一些提示:

我有一个第三方类,我想把它注入到其他bean中。在春天,只需要一些
声明就可以了。使用cdi,现在需要一个工厂类:

public class XProducer {    
    @Produces
    @ApplicationScoped
    public X createX(){
        return new X();
    }
}
令人遗憾的是,X的构造函数调用相当昂贵的业务逻辑,每次由cdi创建代理时,都会调用它,但我无法更改X的行为。这就给我留下了以下我不太喜欢的选项:

  • 在一些丑陋的
    支架
    -类中包装X
  • 创建一些facade并且必须将方法delgate到
    X

还有其他选项吗?

这可能是一种您希望使用
@javax.inject.Singleton的情况,因为它是第三方,您不需要拦截器支持,而且Singleton不生成代理,所以构造函数只会被调用一次。

好的,然后使用EJB:)我最初拒绝了
@Singleton
,因为容器管理的并发创建了一个瓶颈,忽略了它可以被
@ConcurrencyManagement(BEAN)
禁用。为什么要使用EJB?如果您使用
@javax.inject.Singleton
它来自JSR-330,而不是EJB。