2010-03-29 37 views
2

对于EJB和全面发展的应用程序服务器(例如JBoss),我在大多数职业生涯中都使用特殊用途的独立Java应用程序编写和使用了Java EE的有限使用。我想知道将常用设计模式适用于EJB3和JBoss的最佳方法:静态工厂模式。事实上,这是第1项中约书亚Bloch的Effective Java的书(第2版)带有EJB3/JBoss的avaStatic工厂模式

我目前用下面的工厂工作:

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标有@Stateless。现在我可以在JNDI中查找它们并使用注入的资源。

但现在我断开了连接,因为我不再使用工厂。我的第一个想法是更改getProcessor(CredentialsType)方法来执行JNDI查找并返回所需的SLSB实例,但后来我需要配置并传递适当的限定JNDI名称。在我走下这条路之前,我想对接受的做法做更多的研究。

这是如何设计模式在EJB3处理/ Java EE的 -

回答

-1

当你开始玩工厂和“真正的”Java POJO代码时,你基本上需要依赖于JNDI。

依赖注入只适用于EJB服务器的托管组件,基本上就是Servlet和EJB。

当你谈论的泛型java代码想要引用EJB时​​,他们需要通过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查找键进行“硬编码”,但是现在无论如何你都要对类名称进行“硬编码”,那么这又如何呢?

跨容器存在一些潜在的可移植性问题,因为每个人似乎都希望为bean名称使用不同的JNDI标识符。大部分可以在部署中进行调整,但如果没有,那么您可以将这些密钥拉出到配置文件或其他任何内容中。

在Java EE 6中,保证了便携式名称。如果您今天不移植容器,那么请不要担心这一点。

所以,基本上,这根本不是一个断开连接。

-1

有了EJB3,你一般不需要做JNDI查找。 EJB3支持EJB的dependency injection和其他几种类型的资源。如果您的bean属性注释为@EJB,则依赖项将自动由容器注入。

不必进行JNDI查找就意味着您可以像测试POJO一样测试EJB。您可以手动注入依赖关系的模拟实现并对其进行测试,而无需将它们部署到容器中。

+0

我一直在阅读EJB规范。你会如何用我上面的工厂课程去解决这个问题?首先,工厂必须是EJB才能正确截取注释。那么我将如何根据上面的枚举或字符串来选择不同的实现呢? – purecharger 2010-03-30 00:36:02