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



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

这个类只有私有字段和每个字段对应的getter方法。在我的应用程序中,我有许多其他ejb使用ConfigParameter的实例来读取配置值。

现在,我认为将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设置为单例?

您正在使用ejb 3.0。在EJB 3.1中引入了单例EJB。如果您想在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 EJB是一个很好的选择,但我想提出另一个想法供考虑。这取决于您需要多少值以及使用它们的位置,这可能是一种更好的方法,也可能不是。

由于您的ConfigParameter单例EJB只是一个通过@Resource注释从JNDI检索其值的POJO,因此您可以使用模块或应用程序范围的环境项(java:module, java:app)来代替。这样就不需要这个额外的EJB类了;相反,您可以在需要这些值的每个ejb中使用@Resource注释。要做到这一点,只需在需要该值的EJB/web组件中使用@Resource注释,并使用以java:modulejava:app为前缀的名称:@Resource(name="java:app...")

相关内容

  • 没有找到相关文章

最新更新