Как ввести значение в конструктор бина с помощью аннотаций - PullRequest
26 голосов
/ 17 ноября 2010

У моего bean-компонента Spring есть конструктор с уникальным обязательным аргументом, и мне удалось инициализировать его с помощью конфигурации xml:

<bean name="interfaceParameters#ota" class="com.company.core.DefaultInterfaceParameters">
  <constructor-arg>
    <value>OTA</value>
  </constructor-arg>
 </bean>

Затем я использую этот bean-компонент вот так, и он работает хорошо.

 @Resource(name = "interfaceParameters#ota")
 private InterfaceParameters interfaceParameters;

Но я хотел бы указать значение arg конструктора с аннотациями, что-то вроде

 @Resource(name = "interfaceParameters#ota")
 @contructorArg("ota") // I know it doesn't exists!
 private InterfaceParameters interfaceParameters;

Возможно ли это?

Заранее спасибо

Ответы [ 2 ]

63 голосов
/ 17 ноября 2010

Во-первых, вы должны указать конструктор arg в определении вашего компонента, а не в ваших точках внедрения. Затем вы можете использовать аннотацию @Value пружины (пружина 3.0)

@Component
public class DefaultInterfaceParameters {

    @Inject
    public DefaultInterfaceParameters(@Value("${some.property}") String value) {
         // assign to a field.
    }
}

Это также приветствуется, так как Spring рекомендует инжекцию конструктора поверх инжекции в поле.

Насколько я понимаю, это может вас не устраивать, поскольку вы, по-видимому, определяете несколько бинов одного и того же класса с разными именами. Для этого вы не можете использовать аннотации, вы должны определить их в XML.

Однако я не думаю, что это хорошая идея иметь эти разные бобы. Вам лучше использовать только строковые значения. Но я не могу дать больше информации, потому что я не знаю ваших точных классов.

2 голосов
/ 15 июля 2011

Как сказал Божо, вместо конструктора arg вы можете установить свойство ... @ PostConstruct будет вызываться только после того, как все свойства установлены ... так что у вас все равно будет доступная строка ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...