Как внедрить только одно свойство в класс

у меня есть класс

class A{
     private Foo foo;
     private Bar bar;
     private Baz baz;
}

Теперь у этого класса есть конструктор, который инициализирует foo и bar. Однако Baz имеет поле DataSource, которое я хочу ввести с помощью spring. Конструктор класса A инициализирует все, кроме НЕ baz. Теперь класс A инициализируется с помощью new.

A a = new A(Foo, Bar)

Класс A имеет установщик. Бин

<bean id="ABean" class="com.acme.A" >
        <property name="baz">
                    <bean class="com.acme.baz">
                            <property name="dataSource" ref="mysqlDataSource">  </property> 
                    </bean>     
        </property>
    </bean> 

но я продолжаю получать:

nested exception is java.lang.NoSuchMethodException: com.acme.A.<init>()

<сильный>1. Как ввести только одно свойство для каждого компонента, а остальные инициализируются с помощью конструктора?

<сильный>2. Как еще это можно решить?


person mCs    schedule 11.08.2013    source источник
comment
вот аналогичный вопрос, на который вы можете посмотреть; [stackoverflow.com/questions/18069756/ [1]: заголовок stackoverflow.com/questions/18069756/   -  person incomplete-co.de    schedule 11.08.2013
comment
Контейнер Spring не управляет созданными вручную (с новым оператором) bean-компонентами. Если вы хотите внедрить свойство в A, вы должны объявить его как bean-компонент и получить его из контекста Spring. Возможно, попробуйте использовать метод пост-конструкции для инициализации Foo и Bar complete" title="spring, как вызвать метод после завершения инициализации bean-компонента"> stackoverflow.com/questions/1088550/ Это не элегантное решение, но кажется, что невозможно передать не-пружинные bean-компоненты в качестве параметров .   -  person yname    schedule 12.08.2013


Ответы (1)


Для аргументов конструктора используйте тег constructor-arg xml, а для параметров, которые устанавливаются с помощью сеттеров, используйте тег property xml.

Чтобы это работало, вам нужно определить метод setBaz().

Тогда вы должны использовать getBean() и не создавать объект самостоятельно. Позвольте весне построить его для вас.

person selalerer    schedule 11.08.2013
comment
Я получил setBaz() в A. Поскольку Foo, Bar представляют собой динамические и тихие сложные метаданные из файла свойств, заполняемого конфигурацией Apache Commons, я должен делать это программно и создавать обычную программу. Я хочу использовать инъекцию Spring только для свойства Baz. OT Помните, что getBean хорош только один или два раза для каждого проекта. - person mCs; 11.08.2013
comment
@mCs Если Spring, автоматически создающий объект для вас, не подходит для вашей ситуации, почему бы вам также не установить свойство baz самостоятельно? Вы все еще можете прочитать его из файла конфигурации, если хотите. - person selalerer; 12.08.2013