我是相当新的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实现而无需将它们在容器中进行部署。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top