الربيع: حقن فئة داخلية خاصة كعضو في الفصل الخارجي؟

StackOverflow https://stackoverflow.com/questions/2344463

  •  23-09-2019
  •  | 
  •  

سؤال

لدي هيكل الفصل التالي

public class Outer{
    private Mapper a;
    ....

    private class MapperA implements Mapper {

    }

    private class MapperB implements Mapper {

    }
}

في ملف تكوين الربيع الخاص بي ، أود إنشاء فول خارجي ، وتعيين أحد Mappera أو MapPerb كخاصية. هل هذا ممكن؟

<bean id="outer" class="mypackage.Outer">
    <property name="a" ?????='????' />
</bean>

تحرير: بعض المعلومات ، بناءً على ردود الفعل من الإجابات:

  1. حصلت على كسول مع مثالي أعلاه. لديّ مجموعة عامة/getter لمتغير مثيل Mapper.

  2. السبب في أن جميع فصول الخريطة هي فصول داخلية هو أنه من المحتمل أن يكون هناك الكثير منها ، وسيتم استخدامها فقط في هذا الفصل. أنا فقط لا أريد طنًا من فصول Cruft في مشروعي. ربما طريقة المصنع هي فكرة أفضل.

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

المحلول

عادة ما تحتاج إلى مجموعة ل Mapper داخل Outer, ومثال على المطلوب Mapper. ولكن هذه هي:

  1. خاص
  2. داخلي

الفصول ، تصبح صعبة بعض الشيء (كما حددت). إذا قمت بإعدادهم للجمهور ، فأنا متأكد Outer$MapperA إلخ. لكن هذا يبدو سيئًا بعض الشيء. لذا:

  1. هل يحتاجون إلى أن يكونوا داخليين وخاصين؟
  2. ربما يمكن أن يأخذ Outer سلسلة ، وتحديد ما إذا كان يجب إنشاء مثيل له MapperA أو MapperB. أي هناك بعض القدرة على المصنع هنا.

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

نصائح أخرى

الربيع يمكن أن تنشئ private الفصول الداخلية. المشكلة الفعلية في التهيئة الخاصة بك هي أنها غير أيضًاstatic, ، لذلك تحتاج <constructor-arg .../>:

<bean id="outer" class="mypackage.Outer"> 
    <property name = "a">
        <bean class = "mypackage.Outer.MapperA"> 
            <constructor-arg ref = "outer" />
        </bean>
    </property>
</bean> 

على حد علمي ، فمن المستحيل حتى تصنع MapperA و MapperB الطبقات العامة المعتادة.

ولكن إذا كنت تريد الاحتفاظ بها كصفوف خاصة داخلية ، فيمكنك "ضخها" يدويًا.

ستحتاج إلى إنشاء طريقة مع @PostInit التعليقات التوضيحية وتهيئة الخاص بك a الحقل هناك (a = new MapperA () على سبيل المثال ، أو شيء أكثر تعقيدًا). مع هذا النهج ، يجب عليك أيضًا التحقق من أن عمليات الاسترجاعات التهيئة يتم تبديلها في تكوين الربيع الخاص بك.

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