2013-08-26 5 views
1

Я разрабатываю базовое приложение Swing, и даже если я всегда использую Spring Ioc (с конфигурацией xml) для инъекции зависимостей, я хочу попробовать CDI-Weld. Имея следующую структуру, созданную весной, контейнер создает SchoolBoy и UniversityStudent, каждый из которых имеет свое имя.Ввод значений унаследованных свойств с использованием CDI-Weld

public class Student{ 

    protected String name; 

    public void setName(String name){ 
     this.name = name; 
    } 

} 

public class SchoolBoy extends Student{ 

} 

public class UniversityStudent extends Student{ 

} 
<bean class="SchoolBoy"> 
    <property name="name" value="Daniel" /> 
</bean> 

<bean class="UniversityStudent"> 
    <property name="name" value="Rose" /> 
</bean> 

Я видел, что это возможно сделать что-то подобное в CDI с помощью @Inject @Config аннотаций. Однако каждый раз, когда я вижу это, они выше самого свойства и, будучи унаследованным свойством, я не могу сделать это для своих классов здесь. Как достичь каждого подкласса Student, чтобы получить его значение name?

UPDATE

Инъекция, что значения в подклассов не обязательно означает, что их жестко прописывать в файле конфигурации. Сама ценность свойства может быть получена из файла .properties. Однако, учитывая краевой случай, что Student находится в унаследованном проекте, и я хочу наследовать свои классы от него и внедрить это свойство, каково может быть решение?

ответ

1

В настоящее время CDI не поддерживает конфигурацию XML. Для этого вам нужно использовать библиотеку, например Solder. Однако это плохая практика и настоятельно не рекомендуется устанавливать свойства бина, когда вы настраиваете управление зависимостями (spring.xml), поскольку это не тип и не рефакторинг. Другой вариант заключается в использовании метода производителя, где вы установите нужное значение:

public SchoolBoy produceSchoolBoy { 
    //construct new SchoolBoy() and set its name 
} 

и вы будете иметь продюсер для различных типов Универсиады. Не очень гибкий, но он будет работать.

+0

Не обязательно означает, что я хочу включить значение напрямую. Может быть ссылкой на файл * .properties *, где значение хранится. Однако как указать на это, если это поле 'A' class ** protected ** и' B' расширяет 'A', когда я хочу использовать' B'? –

+0

Не понимаю ваш второй вопрос. Не могли бы вы объяснить это более глубоко? –

+0

Я обновил свой вопрос. –