2014-02-17 2 views
9

У меня есть под весной фасоль.Создание экземпляра Spring bean, передавая конструктор args?

public class Employee2 { 

    private int id; 
    private String name; 
    private double salary; 


    public Employee2(int id, String name, double salary) { 
    this.id = id; 
    this.name = name; 
    this.salary = salary; 
    } 

// some logic to call database using above values 

} 

Теперь у меня ниже конфигурационный файл конфигурации весны.

<bean id="emp2" class="com.basic.Employee2"> 
      <constructor-arg name="id" value="" /> 
      <constructor-arg name="name" value="" /> 
      <constructor-arg name="salary" value="" /> 
</bean> 

Теперь я не могу жестко закодировать значения в приведенной выше конфигурации, так как они являются динамическими.

Теперь я получаю весеннюю фасоль программным путем, используя код ниже. Объем боба - singelton.

Employee2 emp = (Employee2)applicationContext.getBean("emp2"); 

Теперь как я могу передать значения в Employee2 конструктор?

Спасибо!

+3

Если они являются динамическими, но вы знаете их во время запуска, вы должны использовать 'spel' (весенний язык выражения) или заполнители свойств для их настройки при запуске. Вы говорите, что это синглтон, поэтому, скорее всего, это ваше дело. Если это не так, вы, вероятно, не должны создавать его как одноэлементный компонент. В любом случае - я бы полностью избегал методологии 'getBean'. У вас есть такая прекрасная инфраструктура для развязки инъекций. Почему вы хотите снова с ним связать? – Avi

+0

Avi, Спасибо за ваш ответ. Во-первых, следует ли использовать компонент Employee2 в качестве Singleton или prototype bean? Поскольку мой компонент только содержит сеттеры и геттеры для полей и метод для вызова некоторой логики DAO. В этом случае мне нужно идти на прототип? – user755806

+0

bellabax, спасибо, что предоставил ссылку. В моем случае мне нужен мой компонент в прототипе? – user755806

ответ

10

Вы можете использовать ApplicationContext#getBean(String name, Object ... params) метод, который

позволяет указать Явный метод аргументы конструктора/Factory аргументы, перекрывая указанные аргументы по умолчанию (если таковые имеются) в определении боба.

Например:

Integer param1 = 2; 
String param2 = "test"; 
Double param3 = 3.4; 
Employee2 emp = 
      (Employee2)applicationContext.getBean("emp2", param1, param2, param3); 

Во всяком случае, в то время как это будет возможно работать, вы должны рассмотреть вопрос об использовании Spring EL, как было отмечено в одном из комментариев по этому вопросу.

+0

kocko, работает ли он с singleton bean ?, потому что ссылка говорит ... аргументы для использования при создании прототипа используя явные аргументы статическому заводскому методу. Недопустимо использовать ненулевое значение args в любом другом случае. – user755806

+0

Тип боба не имеет значения, я думаю. Вы можете попробовать и поделиться результатами. :) –

+0

На самом деле, я был бы удивлен, если бы он работал на одиночные игры ... –