سؤال

هل هناك طريقة ليلقي السيارات الفول الربيع إلى فئة محددة في XML سياق التطبيق؟ أود أن تجنب وضع معلومات حول نوع الفول في 2 أماكن .... في ملف XML التكوين وأيضا في الكود كما يلقي.

وعلى سبيل المثال، في ضوء هذا الملف التكوين

<bean id="bean-name" class="SimpleSpringBean"  scope="prototype">
    <property name="myValue" value="simple value"></property>
</bean>

هل يمكنني الاتصال ApplicationContext.getBean("bean-name") في مثل هذه الطريقة لتجنب مباشرة صب نوع الإرجاع إلى SimpleStringBean. وأنا أعلم أنني يمكن أيضا استدعاء ApplicationContext.getBean("bean-name", SimpleSpringBean.class) لتجنب المدلى بها نفسه، ولكن لا يزال لدي معلومات نوع في 2 أماكن.

ويبدو أن الربيع يمكن الحصول على معلومات فئة (ApplicationContext.getType) أو عن طريق الحصول على نوع من الحبة نفسها، ولكن بأي حال من الأحوال أن يلقي نوع تلقائيا دون تدخل مبرمج.

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

المحلول

وأنا أتفق مع SII إلى، يجب تجنب استدعاء getBean بقدر ما تستطيع. فقط سلك الفاصوليا إلى الفصول الدراسية التي يعتمد عليها.

ومع ذلك، إذا كان لديك فئة واحدة أن يحمل سياق التطبيق، يمكنك توفير وسيلة عام المجمع كما يلي:

class MyContextHolder{
    ApplicationContext appContext;
    ......
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String beanName)
    {
        return (T)appContext.getBean(beanName);
    }
}

وبعد ذلك يمكنك الاتصال من دون الادلاء

MyClass mc = MyContextHolder.getBean("myClassBean");

نصائح أخرى

والجواب هو يجب أن لا تستخدم ApplicationContext.getBean () على الإطلاق إذا كان من الممكن، وتحمل مع مكان واحد لديك لفي رمز التمهيد. (بشكل عام، يجب أن لا تحتاج إلى استخدام getBean () خارج نقاط الدخول التطبيق الخاص بك.)

وأيضا، ما كنت طالبا من المرجح المستحيل في لغة جافا على الإطلاق. صب هي ميزة وقت الترجمة، جنبا إلى جنب مع شيك وقت التشغيل. نوع عودة getBean () ببساطة يجب أن يكون معروفا في وقت الترجمة. حتى لو الربيع يمكن تحديد نوع كائن، فإنه لا يمكن تغيير التوقيعات طريقة خاصة بها في وقت التشغيل.

وشيء آخر هو أنه حتى لو كان هذا ممكنا، فإن ميزة لا يكون كل ذلك مفيدا. لأنه يتم تطبيق الربيع AOP استخدام وكلاء الديناميكي، وتريد دائما تقريبا الربيع لتسليم لك مثيل واجهة تنفذ الفول (التي يمكن أن تكون وكيل اوب)، وليس من الطبقة التنفيذ.

وثمة نهج آخر أود أيضا أن استخدام وautowiring الطبقة إلباس الحذاء باستخدام:

public class Main {
    @Autowired FooFacade foo;
    @Autowired BarFacade bar;

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("appCtx.xml");
        AutowireCapableBeanFactory bf = ctx.getAutowireCapableBeanFactory();
        Object main = bf.createBean(Main.class, 
                                    AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT,
                                    false);
        ((Main) main).run();
    }

    private void run() {
        foo.doBootstrapStuff();
        bar.doMoreBootstrapStuff();
    }
}

و(قانون القيام به من الذاكرة. قد تعمل فقط إذا كان لديك سياق الربيع تكوين لمعالجة الأسلاك الشروح، في هذه الحالة اتخاذ اضعي عن foo وbar يجب أن تعمل.)

والسبب الرئيسي لgetBean كونه مصنف هو التوافق الربيع (يصل إلى الإصدار 2.5.x) مع جافا 1.4. سوف الربيع 3.0 إسقاط ذلك وبالتالي توفر طريقة getBean المكتوب ذلك الحين.

وعلى الرغم من ذلك يجب تجنب يبحث حتى الفاصوليا مباشرة والتقليل من استخدامه إلى أقصى حد ممكن.

وماذا لو كنت أستخدم الربيع بوصفها مصنع الكائن الذي يستخدم على نطاق واسع طلبي. وهذا هو، بدلا من كتابة مجموعة من الفئات التي ترث بالفعل أو التفاف حول فئات Java يعرف أنا فقط تقرر نقل كل ذلك في ملف XML لخفض خطوط رمز جافا. وهذا يعني العديد من خطوط أكس لكنني لن تحتاج إلى إجراء دروس هيكل عظمي جافا والتي I حقن مع الربيع أو autowire. مما يجعل الخطوط من التعليمات البرمجية جافا أقل.

لهذا السبب ولا يزال كما أنا جديدة على الربيع لدي فقط كما جاء في سابقة المشاركات استخدمت أساليب جافا الثابتة التي التفاف حول getBeans ().

ولقد عملت مع الربيع لكنه لا يزال جديدا بالنسبة لي فاغفر سؤالي.

و"لأن ينفذ الربيع AOP استخدام وكلاء الديناميكي، وتريد دائما تقريبا الربيع لتسليم لك مثيل واجهة تنفذ الفول (التي يمكن أن تكون وكيل اوب)، وليس من الطبقة التنفيذ"

وحتى لا يكون هناك أي وسيلة للحصول على الوكيل الحيوية باستخدام getBean ()، ثم ماذا يكون أفضل الممارسات إذا كانت هناك أية واجهات والوقوف فئتها السائق وحدها ليتم تنفيذها؟

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