Question

Je suis assez nouveau pour les serveurs d'applications et complètes soufflées EJB comme JBoss, après avoir écrit et travaillé avec des applications Java autonome ad hoc pour la plupart de ma carrière, avec une utilisation limitée de Java EE. Je me demande sur la meilleure façon d'adapter un modèle de conception couramment utilisé pour EJB3 et JBoss: le modèle d'usine statique. En fait, c'est l'article n ° 1 dans le livre Effective Java de Joshua Bloch (2e édition)

Je travaille actuellement avec l'usine suivante:

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;
}

Cependant, dans les classes de mise en œuvre de CredentialsProcessor, je rechercherai des ressources injectais comme un PersistenceContext, donc je l'ai fait l'interface CredentialsProcessor une interface @Local, et chacune des années impl marqué avec @Stateless. Maintenant, je peux les regarder dans JNDI et utiliser les ressources injectées.

Mais maintenant, j'ai une déconnexion parce que je ne suis pas en utilisant l'usine plus. Ma première pensée a été de changer la méthode de getProcessor(CredentialsType) pour faire une recherche JNDI et retourner l'instance SLSB qui est nécessaire, mais je dois configurer et passer le bon nom JNDI qualifié. Avant d'aller plus dans cette voie, je voulais faire plus de recherches sur les pratiques acceptées.

Comment est ce modèle de conception traité EJB3 / Java EE -

Était-ce utile?

La solution

Lorsque vous commencez à jouer avec des usines et « réel » code Java POJO, vous devez essentiellement compter sur JNDI.

L'injection de dépendance ne fonctionne que sur les composants gérés d'un serveur EJB, et qui est essentiellement Servlets et EJB.

Quand vous parlez code Java générique qui veut se référer à EJBs, ils ont besoin de rechercher les ressources elles-mêmes via JNDI.

La meilleure chose à faire, dans ce cas, est d'écrire simplement une classe de recherche d'emballage rempli de fonctions statiques pour faire vos recherches JNDI plutôt que d'appeler directement JNDI dans chaque mise en œuvre. Et puis utiliser que dans vos implémentations.

C'est juste une règle générale générique.

Maintenant, pour votre cas, considérez ceci.

Vous avez:

static {
    PROCESSORS.put(CredentialsType.CSV, new CSVCredentialsProcessor());
}

Ce n'est pas différent de:

static {
    PROCESSORS.put(CredentialsType.CSV, "java:comp/env/ejb/CSVCredentialProcessorSessionBean");
}

Ensuite, dans votre code getProcessor ():

Context c = new InitialContext();
return (CredentialsProcessor) c.lookup(PROCESSORS.get(type));

Voir, au fond, le code est identique, et votre interface d'usine est le même pour les clients.

Vous devez « coder en dur » la clé de recherche JNDI, mais vous êtes « coder en dur » les noms de classe maintenant de toute façon, alors comment est-ce différent?

Il y a des problèmes de portabilité potentiels à travers des conteneurs dans la mesure où tout le monde semble pratique d'avoir des identificateurs de JNDI pour les noms de haricots. La plupart d'entre qui peut être modifié dans le déploiement, mais sinon, vous pouvez tirer ces clés dans un fichier de configuration, ou autre.

En Java EE 6, il y a des noms portables garantis. Si vous n'êtes pas conteneurs aujourd'hui le portage, alors ne vous inquiétez pas du tout.

Donc, en gros, ce n'est pas vraiment une déconnexion du tout.

Autres conseils

Avec EJB3, vous ne généralement pas besoin de faire des recherches JNDI. EJB3 soutient injection de dépendance de plusieurs autres et EJBs types de ressources. Si votre attribut de haricot est annotées avec @EJB, la dépendance sera par le conteneur injecter automatiquement.

Ne pas avoir à faire une recherche JNDI signifie que vous pouvez tester votre EJB comme un POJO à des fins de tests unitaires. Vous pouvez simplement injecter manuellement les implémentations simulacres des dépendances et de les tester sans avoir à les déployer dans un conteneur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top