与EJB3 / JBoss的avaStatic工厂模式
题
我是相当新的EJB和完全成熟的应用服务器如JBoss,编写及特殊目的的独立的Java应用程序工作了大多数我的职业生涯中,在使用有限的Java EE的。我想了解一下,以适应一个常用的设计模式EJB3和JBoss的最佳方式:静态工厂模式。事实上,这是第1项中约书亚Bloch的Effective Java的书(第2版)
我目前正在与下列工厂工作:
public class CredentialsProcessorFactory {
private static final Log log = LogFactory.getLog(CredentialsProcessorFactory.class);
private static Map<CredentialsType, CredentialsProcessor> PROCESSORS =
new HashMap<CredentialsType, CredentialsProcessor>();
static {
PROCESSORS.put(CredentialsType.CSV, new CSVCredentialsProcessor());
}
private CredentialsProcessorFactory() {}
public static CredentialsProcessor getProcessor(CredentialsType type) {
CredentialsProcessor p = PROCESSORS.get(type);
if(p == null)
throw new IllegalArgumentException("No CredentialsProcessor registered for type " + type.toString());
return p;
}
然而,在CredentialsProcessor的实现类,我需要注入的资源,例如一个PersistenceContext
,所以我使CredentialsProcessor
接口@Local
接口,并且每个IMPL的标有1 @Stateless
。现在,我可以看看他们起来JNDI和使用注入资源。
但现在我,因为我没有使用工厂再有脱节。我首先想到的是改变getProcessor(CredentialsType)
方法做一个JNDI查找并返回所需的SLSB实例,但后来我需要配置,并通过适当的合格的JNDI名称。之前,我走这条路,我想做的事上公认的做法更多的研究。
这是如何设计图案在EJB3处理/ Java EE的? -
解决方案
当你开始用工厂和“真实”的Java POJO代码打,你基本上需要依靠JNDI。
在依赖注入仅适用于EJB服务器的管理的组件,且基本上的Servlet和EJB。
当你说想要引用EJB的通用Java代码,他们需要通过JNDI查找资源本身。
做的最好的事情,在这种情况下,仅仅是写充满了静态函数做JNDI查找,而不是直接在每个实现调用JNDI包装查找类。然后使用您的实现。
这只是一个普通的总体规则。
现在,您的具体情况,考虑这一点。
您有:
static {
PROCESSORS.put(CredentialsType.CSV, new CSVCredentialsProcessor());
}
这是没有不同:
static {
PROCESSORS.put(CredentialsType.CSV, "java:comp/env/ejb/CSVCredentialProcessorSessionBean");
}
然后,在你getProcessor()代码:
Context c = new InitialContext();
return (CredentialsProcessor) c.lookup(PROCESSORS.get(type));
请参阅,基本上,该代码是相同的,并且你的工厂接口是相同的到客户机。
您必须“硬编码”的JNDI查找键,但你是“硬编码”之类的名称现在反正,所以这是怎么不同?
有跨容器一些潜在的便携性的担忧,即每个人似乎都喜欢用不同的JNDI标识符bean的名字。大部分可以在部署进行调整,但如果没有,那么你可以把这些键调出到一个配置文件,或者别的什么东西。
在Java EE 6的,有保证便携式名称。如果你今天不移植的容器,然后做这个不用担心的。
所以,基本上,它不是一个真正的断开的。
其他提示
使用EJB3,您一般不需要做JNDI查找。 EJB3支持 EJB和其他几种类型的资源依赖注入。如果你的bean属性与@EJB
注释,依赖将被自动由容器注入。
不必做JNDI查找意味着你可以测试你的EJB就像一个POJO单元测试的目的。你可以手工注入依赖和测试他们的mock实现而无需将它们在容器中进行部署。