2016-07-18 3 views
0

У меня есть приложение, состоящее из 2 проектов - пользовательский интерфейс и данные. В проекте данных, я добавил пружинный компонент в контексте приложения XML:Впрыскивание пружинной фасоли - свойства впрыска после того, как bean был определен

<bean id="mail-notification-service" class="com.test.DefaultEmailNotificationManager"> 
    </bean> 

Этот менеджер рассылает уведомления по запросу, а также параметры использования простого перечисления и объект а параметры (оба из которых используют классы только в проекте данных), чтобы выбрать IEmailGenerator и использовать его для отправки электронной почты.

Менеджер определяется что-то вроде:

public class DefaultEmailNotificationManager implements IEmailNotificationManager { 
    public MailResult sendEmail(EmailType type) { .. } 
    public void register(IEmailGenerator generator) { .. } 
} 

public interface IEmailGenerator { 
    public EmailType getType(); 
} 

Беда в том, что генераторы определены в проекте пользовательского интерфейса, так что они могут делать такие вещи, как разжиться классов калитки страниц, цикл запроса и ресурсы приложения , Таким образом, я не могу добавить их в bean-компонент в applicationContext проектов данных, чтобы другие модули как в проектах данных, так и в пользовательском интерфейсе могли их использовать.

Есть ли способ в ApplicationContext проекта пользовательского интерфейса, чтобы сделать что-то вроде:

<bean id="exclusionNotifier" class="com.test.ui.ExclusionEmailNotifier"/> 
<bean id="modificationNotifier" class="com.test.ui.ModificationEmailNotifier"/> 

<call-method bean-ref="mail-notification-service" method="register"> 
    <param name="generatorImplementation", ref="exclusionNotifier"/> 
</call-method> 

<call-method bean-ref="mail-notification-service" method="register"> 
    <param name="generatorImplementation", ref="modificationNotifier"/> 
</call-method> 

можно вручную связать бобы вместе в методе WicketApplication.init, но предпочел бы что-то более элегантное. Кто-нибудь сделал что-нибудь подобное?

Использование пружины 4.1.4

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

ответ

1

INJECT генераторы в mail-notification-service боба (например, с помощью autowire="byType") и зарегистрировать их сразу после строительства боб с использованием init-method (см Initialization callbacks в пружине документы)

public class DefaultEmailNotificationManager implements IEmailNotificationManager { 
    private Collection<IEmailGenerator> generators; 
    public void init() { 
    for(IEmailGenerator g : generators) { 
     register(g); 
    } 
    } 
    public void setGenerators(Collection<IEmailGenerator> generators) { 
    this.generators = generators; 
    } 
    public MailResult sendEmail(EmailType type) { .. } 
    private void register(IEmailGenerator generator) { .. } 
} 

Дейты ApplicationContext:

<bean id="mail-notification-service" 
     class="com.test.DefaultEmailNotificationManager" 
     init-method="init" 
     autowire="byType" /> 

UI в ApplicationContext:

<bean id="exclusionNotifier" class="com.test.ui.ExclusionEmailNotifier"/> 
<bean id="modificationNotifier" class="com.test.ui.ModificationEmailNotifier"/> 
+0

Привет, спасибо за ваш ответ. Я попробовал, но получил метод NPE в методе init - генераторы не установлены. – fancyplants

+1

Я обновил ответ. Используйте установку на основе сетки поля «генераторы». –

+0

Спасибо, что заработало! Весенние документы говорят только, что это можно сделать здесь: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-autowire - в другом месте они заявляют, что если более чем один бит будет соответствовать, то он потерпит неудачу. Даже в таблице 7.2 в ссылке говорится, что до того, как руководство поправится в абзаце после! – fancyplants

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

  • Нет связанных вопросов^_^