我有一个ConfigParameter
SLSB,它从ejb-jar.xml
文件读取配置值。
这个类只有私有字段和每个字段对应的getter方法。在我的应用程序中,我有许多其他ejb使用ConfigParameter
的实例来读取配置值。
现在,我认为将ConfigParameter
改为@Singleton
是个好主意,因为它的状态在整个应用程序中共享。
但是在ejb-jar.xml
中,我只能将session-type
设置为Stateful
或Stateless
。文件看起来像这样:
<?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>
我的问题是:
- 这是一个好主意,使这个bean的单例?
- 如果是,如何实现?
- 为了理解:为什么不允许将
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:module
或java:app
为前缀的名称:@Resource(name="java:app...")
。