2011-11-14 61 views
0

我有一個ConfigParameter SLSB,它從ejb-jar.xml文件讀取配置值。@Singleton bean從ejb-jar.xml讀取值

該類只有專用字段,並且每個字段都有相應的getter方法。在我的應用程序中,我有很多其他EJB使用ConfigParameter的實例來讀取配置值。

現在,我認爲將ConfigParameter設爲@Singleton是個好主意,因爲它的狀態是在整個應用程序中共享的。

但在ejb-jar.xml我可以設置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?
+0

ConfigParameter是一個簡單的POJO,它只包含所有從環境條目檢索到的原始字符和/或字符串字段? – shelley

+0

'COnfigParameter'是POJO用'@ Stateless'註解的。字段值通過'@Resource(name =「...」)'注入。我跟着Piotr Nowickis回答,我現在有一個Singleton – hage

回答

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"> 

或者只是使用@Singleton註釋的EJB類本身。

是的 - 我肯定會說它是合適的將應用程序範圍的配置bean標記爲Singleton。

+0

謝謝!由於3.0規範,我用'@ Singleton'註釋了我的EJB,但Eclipse並沒有讓我使用Singleton作爲'session-type'。無狀態和Singleton定義引起了這個問題。現在它可以工作。大。 – hage

+0

@hage很高興它的工作!然而,你知道你不需要在註釋和ejb-jar.xml中指定它(這些地方就足夠了),對吧? –

+0

我知道了 - 現在:)我們團隊中的其他人創建了這兩個部分。我們對整個JavaEE和EJB的東西都很新穎:) – hage

0

雖然Singleton EJB是一個不錯的選擇,我想提出另一個想法考慮。取決於您需要多少值以及它們的使用位置,這可能是也可能不是更好的方法。

由於您ConfigParameter辛格爾頓EJB僅僅是經由@Resource註釋JNDI檢索其值的POJO,有可能你使用的模塊或應用程序範圍的環境條目(java:modulejava:app)來代替。這可以消除對這個額外EJB類的需求;相反,您可以在每個需要值的EJB中使用@Resource批註。要做到這一點,只需使用名稱前綴爲java:modulejava:app@Resource(name="java:app...")的需要值的EJB/Web組件中的@Resource批註。