الربيع: حقن فئة داخلية خاصة كعضو في الفصل الخارجي؟
-
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>
تحرير: بعض المعلومات ، بناءً على ردود الفعل من الإجابات:
حصلت على كسول مع مثالي أعلاه. لديّ مجموعة عامة/getter لمتغير مثيل Mapper.
السبب في أن جميع فصول الخريطة هي فصول داخلية هو أنه من المحتمل أن يكون هناك الكثير منها ، وسيتم استخدامها فقط في هذا الفصل. أنا فقط لا أريد طنًا من فصول Cruft في مشروعي. ربما طريقة المصنع هي فكرة أفضل.
المحلول
عادة ما تحتاج إلى مجموعة ل Mapper
داخل Outer
, ومثال على المطلوب Mapper
. ولكن هذه هي:
- خاص
- داخلي
الفصول ، تصبح صعبة بعض الشيء (كما حددت). إذا قمت بإعدادهم للجمهور ، فأنا متأكد Outer$MapperA
إلخ. لكن هذا يبدو سيئًا بعض الشيء. لذا:
- هل يحتاجون إلى أن يكونوا داخليين وخاصين؟
- ربما يمكن أن يأخذ 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 ()
على سبيل المثال ، أو شيء أكثر تعقيدًا). مع هذا النهج ، يجب عليك أيضًا التحقق من أن عمليات الاسترجاعات التهيئة يتم تبديلها في تكوين الربيع الخاص بك.