@Singleton bean从ejb-jar.xml读取值

时间:2011-11-14 08:41:05

标签: java-ee singleton stateless ejb-jar.xml

我有一个ConfigParameter SLSB,可以从ejb-jar.xml文件中读取配置值。

此类只有私有字段,并且每个字段都有相应的getter方法。在我的应用程序中,我有很多其他使用ConfigParameter实例来读取配置值的EJB。

现在,我认为将ConfigParameter设为@Singleton是个好主意,因为它的状态在整个应用程序中共享。

但在ejb-jar.xml我只能将session-type设置为StatefulStateless。该文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0">
  <enterprise-beans>    
    <session>
      <ejb-name>ConfigParameter</ejb-name>
      <ejb-class>myapp.util.ConfigParameter</ejb-class>      
      <session-type>Stateless</session-type> <!-- make this a Singleton -->
      <env-entry>
        <env-entry-name>adminRoleName</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>admin</env-entry-value>
      </env-entry>
    </session>
  </enterprise-beans>
</ejb-jar>

我的问题是:

  1. 让这个bean成为单身人士是个好主意吗?
  2. 如果是,我该如何实现?
  3. 为了理解:为什么不允许将session-type设置为Singleton?

2 个答案:

答案 0 :(得分:3)

您正在使用EJB 3.0。 Singleton EJB是在EJB 3.1中引入的。如果要在ejb-jar.xml中定义它,则应定义适当的版本(请注意版本属性,并将XSD位置更改为 3.1

<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" 
    version="3.1">

或者只是在EJB类本身上使用@Singleton注释。

是的 - 我肯定会说这是合适的将应用程序范围的配置bean标记为Singleton。

答案 1 :(得分:0)

虽然Singleton EJB是一个不错的选择,但我想提出另一个想法供我考虑。根据您需要的值以及使用位置,这可能是也可能不是更好的方法。

由于您的ConfigParameter Singleton EJB只是一个通过@Resource注释从JNDI检索其值的POJO,因此您可以使用模块或应用程序范围的环境条目({{1 }},java:module)而不是。这可以消除对这个额外EJB类的需求;相反,您可以在每个需要值的EJB中使用java:app注释。为此,只需使用前缀为@Resource@Resourcejava:module的名称,在需要值的EJB / Web组件中使用java:app注释。