Spring: внедрение частного внутреннего класса в качестве члена внешнего класса? - PullRequest
4 голосов
/ 26 февраля 2010

У меня следующая структура класса

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

    private class MapperA implements Mapper {

    }

    private class MapperB implements Mapper {

    }
}

В моем конфигурационном файле Spring я хотел бы создать внешний компонент и назначить один из параметров MapperA или MapperB в качестве свойства. Возможно ли это?

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

Редактировать: дополнительная информация, основанная на отзывах:

  1. Мне стало лень с моим примером выше. У меня есть общедоступный установщик / получатель для переменной экземпляра Mapper.

  2. Причина, по которой все классы Mapper являются внутренними классами, заключается в том, что их потенциально может быть много, и они будут использоваться только в этом классе. Я просто не хочу, чтобы в моем проекте была куча уроков. Возможно, лучше использовать фабричный метод.

Ответы [ 3 ]

7 голосов
/ 26 февраля 2010

Spring может создавать экземпляры 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> 
1 голос
/ 26 февраля 2010

Насколько я знаю, это невозможно, пока вы не сделаете MapperA и MapperB обычные публичные уроки.

Но если вы хотите сохранить их как внутренние закрытые классы, вы можете "внедрить" их вручную.

Вам нужно будет создать метод с аннотацией @PostInit и инициализировать там свое поле a (например, a = new MapperA () или что-то более сложное). При таком подходе вы также должны проверить, что обратные вызовы инициализации включены в вашей конфигурации Spring.

1 голос
/ 26 февраля 2010

Обычно вам нужен установщик для Mapper в Outer и экземпляр необходимого Mapper. Но так как они:

  1. частный
  2. внутренний

классы, которые становятся немного хитрыми (как вы определили). Если вы сделаете их общедоступными, я уверен, что вы можете создать экземпляр, используя Outer$MapperA и т. Д. Но это кажется немного неприятным. Итак:

  1. они должны быть внутренними и личными?
  2. возможно, Outer может взять String и определить из этого, следует ли создавать экземпляр MapperA или MapperB. то есть здесь есть некоторые заводские возможности.

Самое простое, что нужно сделать, - это действительно определить, должны ли они быть внутренними / личными. Если это так, то на них действительно не следует ссылаться в конфиге, который должен говорить об общедоступных классах.

...