代码之家  ›  专栏  ›  技术社区  ›  papiomytoglou

用于即时CDIBean实例化的干净解决方案

  •  5
  • papiomytoglou  · 技术社区  · 7 年前

    @ApplicationScoped
    public class A {
    
        private B b;
    
        @Inject
        public A(B b) {
            this.B = b;
        }
    
    }
    
    @ApplicationScoped
    public class B {
    
        private C c;
    
        @Inject
        public B(C c) {
            this.C = c;
        }
    
    }
    
    @ApplicationScoped
    public class C {
    
        @PostConstruct
        public void start() {
            // processing that should begin on startup
        }
    
    }
    

    C#start 在部署完成时调用。通常在网上建议的模式就是所提出的模式 here toString 仅用于触发 B 用于实例化实际 B C

    从CDI 1.1开始,将以下方法添加到 A

    public void init(@Observes @Initialized(ApplicationScoped.class) Object init) {
       B.toString();
    }
    

    因此实例化/注入链被触发,并最终调用 @PostConstruct 带注释的方法 C .

    1 回复  |  直到 7 年前
        1
  •  4
  •   Siliarus    7 年前

    你的最佳选择与 article you mentioned 建议。E、 g.设置一个扩展,挑选你想要初始化的bean并初始化它们,然后对它们调用一个(无害的)方法。

    显然,这只对部署中的少数bean(我认为最多是应用程序范围的bean)有意义,因此不会有太多开销。有一些额外的样板,但这并不是说你必须写那么多的行才能使这项工作。

    为了更好,您可以让所有bean使用默认值实现一个虚拟接口 ping() toString() .