2010-11-17 3 views
20

Моего весеннего боба есть конструктор с уникальным обязательным аргументом, и мне удалось инициализировать его с помощью конфигурации XML:Как придать значение бобового конструктору с помощью аннотаций

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

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

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

Но я хотел бы указать значение ARG застройщик с annocations, что-то вроде

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

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

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

+0

Возможно, ответ дан [здесь] (http://stackoverflow.com/a/2306468/267197). –

ответ

45

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

@Component 
public class DefaultInterfaceParameters { 

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

This is also encouraged as Spring advises constructor injection over field injection.

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

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

+0

спасибо за ваш ответ, что вы подразумеваете под «использовать только строковые значения»? – tbruyelle

+0

ну, вам нужна строка «OTA». Для этого вам не нужен целый объект. – Bozho

+0

О, я вижу, строка «OTA» используется в методе @postConstruct моего компонента и является обязательной информацией для создания компонента. Строка используется для извлечения данных из базы данных. Каждый бит этого типа будет возвращать разные данные для каждого строкового значения. Кстати, вы правы в использовании xml, поскольку я определяю несколько компонентов для одного и того же класса, я не могу использовать аннотации. – tbruyelle

1

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

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