代码之家  ›  专栏  ›  技术社区  ›  Sebastien Dionne

Java EE 6 EJB教程:为什么不使用@Singleton而不是@Stateless

  •  0
  • Sebastien Dionne  · 技术社区  · 13 年前

    我看到了Java EE 6教程中的一个EJB示例。在这个例子中,我想知道我是否可以使用@Singleton而不是@Stateless?

    package converter.ejb;
    
    import java.math.BigDecimal;
    import javax.ejb.*;
    
        @Stateless
        public class ConverterBean {
    
            private BigDecimal yenRate = new BigDecimal("83.0602");
            private BigDecimal euroRate = new BigDecimal("0.0093016");
    
            public BigDecimal dollarToYen(BigDecimal dollars) {
                BigDecimal result = dollars.multiply(yenRate);
                return result.setScale(2, BigDecimal.ROUND_UP);
            }
    
            public BigDecimal yenToEuro(BigDecimal yen) {
                BigDecimal result = yen.multiply(euroRate);
                return result.setScale(2, BigDecimal.ROUND_UP);
            }
        }
    

    在我看来像是一种乌蒂尔方法。

    如果我没有使用EJB,我本可以在这个ConverterBean上使用静态方法。

    还有一个问题。我知道这是一个简单的示例,但如果我像示例中那样使用servlet中的代码,为什么只使用EJB呢?

    3 回复  |  直到 11 年前
        1
  •  1
  •   Petr Mensik    13 年前

    是的,我认为这是一个糟糕的用例 EJBs 完全这些方法肯定应该在一些被声明为静态方法的实用程序类中。对于辛格尔顿,如果你不需要,就不要使用(当然,你可以让这门课成为辛格尔顿课程,但你会得到什么?)。保持代码尽可能简单。

        2
  •  1
  •   mkayman    13 年前

    如果你只使用@Singleton而不是@Stateless,你会降低应用程序的性能。因为,有两种访问@Singleton bean的方法,容器管理的和bean管理的。默认为容器管理,默认Lock为LockType.WRITE。因此,只有一个客户端可以同时访问bean,其他客户端将被阻止。

        3
  •  0
  •   Kurohige    13 年前

    如果我只需要一类实用程序,我真的看不出在中使用EJB的原因。 我认为您可以将它用作一个简单的最终实用程序类,并在其中使用静态方法。 如果您真的需要从容器事务、JPA的使用、一些远程服务或类似的东西中获益,那么您将使用EJB。