2013-04-16 2 views
1

У меня есть 3 реализации интерфейса, и для того, чтобы создать экземпляр одного из них, мне нужно проверить параметр из базы данных. Я планировал сделать это с помощью шаблона фабрики, но так как я использую JSF 2 dependecy injection в остальной части моего приложения, мне было интересно, если есть способ сделать это, можно ли сделать инъекцию зависимостей динамически? Могу ли я каким-то образом указать способ или что-то, чтобы поднять правильную реализацию в каждый момент? Для бэкэнд я использую весеннее ядро, поэтому способ сделать это с весенним контекстом будет работать.Динамическая зависимость в jsf 2 или весна 3

Я использую аннотации для всего (@Autowired для весны, @ManagedProperty для JSF).

EDIT: Проект будет развернут на сервере Tomcat.

ответ

1

Предлагаю вам использовать CDI в проекте JSF, затем вы можете использовать программную инъекцию. Вы должны начать с добавления CDI Qualifiers к вашим реализациям интерфейса (в основном вы создадите пользовательскую аннотацию для каждой реализации - tutorial). Затем вы можете использовать что-то вроде

@Named //similar to ManagedBean 
@RequestScoped 
public Bean { 

    @Inject 
    @Any 
    Instance<YourInterface> yourInterface; 

    public void someMethod() { 
     if(someCondition) { 
      InterfaceImpl impl = yourInterface.select(new SomeOfYourQualifiers()).get(); 
     } 
    }  
} 

Source

Кроме того, вы не должны использовать Autowired в пользу Inject. Я также уверен, что есть некоторые Спринг способ, как в этом, но я оставлю это в какой-то Спринг специалиста здесь :-)

EDIT

В соответствии с этим answer действительно можно запустить CDI на Tomcat , Вы также найдете некоторые обучающие программы, подобные этому one. И подход Spring может использовать AutowireCapableBeanFactor, но, как я уже сказал, я не очень хорошо знаю Spring, так что это просто дикий взгляд :-)

+1

Thanx для ответа! Однако я не могу использовать CDI, нам разрешено использовать Tomcat 6, и, насколько я знаю, он не поддерживает CDI :( – parranz

+0

См. Мои править –

+0

Привет, до сих пор не могу изменить его на CDI, проект уже слишком велик, и нам не хватает времени :(Я подожду и посмотрю, есть ли способ сделать это с помощью javax.faces.bean, и если это не так, я попробую AutowireCapableBeanFactory, он действительно выглядит как то, что нам нужно. Большое спасибо! – parranz

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