سؤال

أنا جديد إلى حد ما على EJBS وخوادم تطبيقات كاملة مثل JBoss ، بعد أن كتبت وعملت مع تطبيقات Java المستقلة للأغراض الخاصة لمعظم مسيرتي المهنية ، مع استخدام محدود لـ Java EE. أتساءل عن أفضل طريقة لتكييف نمط التصميم الشائع مع EJB3 و JBOSS: نمط المصنع الثابت. في الواقع هذا هو البند رقم 1 في كتاب جافا الفعال في جوشوا بلوش (الطبعة الثانية)

أنا أعمل حاليًا مع المصنع التالي:

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

ومع ذلك ، في فئات تنفيذ بيانات الاعتماد ، أحتاج إلى موارد محقونة مثل أ PersistenceContext, ، لذلك لقد صنعت CredentialsProcessor الواجهة أ @Local الواجهة ، وكل من ضمنية تحمل علامة مع @Stateless. الآن يمكنني البحث عنها في JNDI واستخدام الموارد المحقونة.

لكن الآن لدي فصل لأنني لم أعد أستخدم المصنع. فكرتي الأولى كانت تغيير getProcessor(CredentialsType) طريقة لإجراء بحث JNDI وإرجاع مثيل SLSB المطلوب ، ولكن بعد ذلك أحتاج إلى تكوين وتمرير اسم JNDI المؤهل المناسب. قبل أن أسير في هذا المسار ، أردت إجراء المزيد من الأبحاث حول الممارسات المقبولة.

كيف يتم التعامل مع نمط التصميم هذا في EJB3 / Java EE؟-

هل كانت مفيدة؟

المحلول

عندما تبدأ اللعب مع المصانع ورمز Java Pojo "الحقيقي" ، فأنت بحاجة أساسًا إلى الاعتماد على JNDI.

يعمل حقن التبعية فقط على المكونات المدارة لخادم EJB ، وهذا هو أساسا servlets و EJBs.

عندما تتحدث عن رمز جافا العام الذي يريد الرجوع إلى EJBS ، فإنهم بحاجة إلى البحث عن الموارد نفسها عبر 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 المختلفة لأسماء الفاصوليا. يمكن تعديل معظم ذلك في النشر ، ولكن إذا لم يكن الأمر كذلك ، فيمكنك سحب هذه المفاتيح إلى ملف التكوين ، أو أي شيء آخر.

في Java EE 6 ، هناك أسماء محمولة مضمونة. إذا لم تكن تنقل الحاويات اليوم ، فلا تقلق بشأن هذا على الإطلاق.

لذلك ، في الأساس ، ليس حقًا فصلًا على الإطلاق.

نصائح أخرى

مع EJB3 ، لا تحتاج عمومًا إلى إجراء بحث JNDI. يدعم EJB3 حقن التبعية من EJBs وعدة أنواع أخرى من الموارد. إذا تم شرح سمة الفاصوليا @EJB, ، سيتم حقن التبعية تلقائيًا بواسطة الحاوية.

عدم الاضطرار إلى إجراء بحث JNDI يعني أنه يمكنك اختبار EJB مثل Pojo لأغراض اختبار الوحدة. يمكنك فقط ضخ تطبيقات وهمية من التبعيات واختبارها دون الحاجة إلى نشرها في حاوية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top