2013-08-11 1 views
1

У меня есть классКак вводить только одно свойство в классе

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

Теперь этот класс имеет конструктор, который инициализирует Foo и бар. Baz однако имеет поле DataSource, которое я хочу, чтобы впрыскивалось пружиной. Конструктор классов A инициализирует все, кроме NOT baz. Теперь класс A инициализирован new.

A a = new A(Foo, Bar) 

В классе A установлен сеттер. Bean

<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. Каким другим способом это можно решить?

+0

вот аналогичный вопрос, на который вы можете обратить внимание; [Http://stackoverflow.com/questions/18069756/is-default-constructor-required-in-spring-injection/18070366][1] [1]: http://stackoverflow.com/ Вопросы/18069756/is-default-constructor-required-in-spring-injection/18070366 –

+0

Весенний контейнер не управляет вручную созданным (с «новым» оператором) бобами. Если вы хотите ввести свойство в A, вы должны объявить его как bean-компонент и получить из весеннего контекста. Возможно, попробуйте использовать метод post-construct для инициализации Foo и Bar http://stackoverflow.com/questions/1088550/spring-how-to-call-a-method-after-bean-initialization-is-complete It не изящное решение, но кажется, что невозможно передать не-весенние бобы в качестве параметров. – yname

ответ

1

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

Для этого вам необходимо определить метод setBaz().

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

+0

Я получил 'setBaz()' в 'A'. Поскольку 'Foo, Bar' являются динамически и тихими сложными метаданными из файла свойств, заполненного конфигурацией Apache Commons, я должен делать это программно и создаваться обычной программой. Я хочу использовать Spring-инъекцию только для свойства 'Baz'. OT Помните, что getBean хорош только один или два раза в проекте. – mCs

+0

@mCs Если Spring автоматически создает объект для вас, это не хорошо для вашей ситуации, почему бы вам не установить свойство baz самостоятельно? Вы можете прочитать его из файла конфигурации, если хотите. – selalerer

 Смежные вопросы

  • Нет связанных вопросов^_^