【问题标题】:Anyway to lock a @Produces method无论如何要锁定 @Produces 方法
【发布时间】:2013-10-25 17:18:34
【问题描述】:

我有一个带有 Producer 方法的 Singleton EJB。

@javax.ejb.Singleton
public class MyBean{

    private Something something;

    @Produces
    public MySomething getSomething() {              
          if(null == something){
               LOG.info("Initializing MySomething.");
               something = new Something();
          }
          return something;
    }
}

我以为这会锁定,但我在日志中多次看到此"Initializing MySomething.",然后某事抛出java.lang.StackOverflowError

看来我需要锁定这个@Produces 方法。

可以为此目的使用java.util.concurrent.Semaphore 吗?

【问题讨论】:

    标签: java-ee-6 cdi


    【解决方案1】:

    我猜你真正想要的是这个:

    @Produces @ApplicationScoped
    public MySomething getSomething()  {
        // ....
    }
    

    由于您的生产者方法没有明确的范围,它默认为@Dependent 范围,因此为每个注入点创建一个新的 bean 实例。这就是您收到多条日志消息的原因。

    【讨论】:

    • 我相信这就是我想要的。我试试看。
    【解决方案2】:

    另一种方法是在您的 post 构造中创建Something,然后简单地返回它。 EJB 单例意味着每个应用程序只有一个实例

    public class MyBean {
        private Something something;
        @PostConstruct
        public void createSomething() {
            this.something = new Something();
        }
        @Produces
        public Something getSomething() {
            return this.something;
        }
    }
    

    【讨论】:

    • 好点。但是您不能直接注释该字段吗?为什么要额外的吸气剂?
    • 你可以。我一直发现方法生成器更易于阅读。
    猜你喜欢
    • 1970-01-01
    • 2015-11-16
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多