【问题标题】:CDI: How to put an existing object into application scope (without writing CDI extension)?CDI:如何将现有对象放入应用程序范围(无需编写 CDI 扩展)?
【发布时间】:2011-07-23 17:06:22
【问题描述】:

我有一个手动初始化的对象(旧代码)。 我想将此对象放到应用程序上下文中,以使其通过 CDI 可用。

如何在不编写 CDI 扩展的情况下做到这一点?

【问题讨论】:

    标签: cdi


    【解决方案1】:

    使用生产者。制作一个 @Produces 类实例的 bean。

    【讨论】:

    • @Injects 的同一个bean 中拥有@Produces 方法是个好主意吗?我可以在不创建循环依赖的情况下以某种方式延迟初始化以实现此目的吗?有 Instance<...> 但我必须再创建一个字段来保留实际的 bean...
    • 循环依赖会如何出现?生产者通常不依赖其消费者
    • 那我如何CDI化this.foo = new Foo(this)
    • 所以你确实需要一个循环引用(有或没有 CDI).. 好吧,CDI 通过代理支持循环引用,所以只需注入生产者,并将生成的对象注入原始对象。
    • “this”是 CDI bean 吗? “这个”应用程序是否有作用域?在这种情况下,因为“Foo”也是应用程序范围的,最好将 Foo 作为依赖范围并有效地置于 CDI 管理之外。取决于你想如何访问 Foo。我想只有一个“this”和一个“Foo”,但它们有关系吗?你能用@Producers 生成第三个类,它同时实例化“This”和“Foo”吗?如果 Foo 的构造函数如此连接,将“Foo”注入“This”是否有意义?或者,如果您的意图是能够使用替代 Foo,您是否需要 Foo 工厂?
    【解决方案2】:

    你需要这样的东西吗?

    @ApplicationScoped  
    public class ApplicationScopedClass {   
    
        @Produces  
        public static ApplicationScopedClass makeAnInstance() {  
          return new ApplicationScopedClass();  
        }
    }
    

    【讨论】:

    • 感谢指出,我是新来的还不知道所有的东西
    • 不客气,不用担心,这绝对是正常的。如果您有时间,这里有一个Mini-Tour 的链接,以了解这个小社区是如何运作的。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多