0

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

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

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

但在ejb-jar.xmlI 中只能设置session-typeStatefulStateless。该文件如下所示:

<?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?
4

2 回答 2

3

您正在使用 EJB 3.0。单例 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">

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

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

于 2011-11-14T08:49:00.370 回答
0

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

由于您的ConfigParameterSingleton EJB 只是一个 POJO,它通过@Resource注解从 JNDI 中检索其值,因此您可以使用模块或应用程序范围的环境条目 ( java:module, java:app) 代替。这可以消除对这个额外 EJB 类的需要;相反,您可以只@Resource在需要这些值的每个 EJB 中使用注释。为此,只需使用@ResourceEJB/web 组件中需要该值的注释,使用前缀为java:modulejava:app:的名称@Resource(name="java:app...")

于 2011-11-19T16:44:10.340 回答