2016-07-18 22 views
0

Ich habe eine Anwendung bestehend aus 2 Projekten - UI und Daten. In dem Data-Projekt habe ich eine Feder Bohne in den XML-Anwendungskontext hinzugefügt:Spring Bean Injektion - inject Eigenschaften nach Bean wurde definiert

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

Dieser Manager-Benachrichtigungen auf Anfrage sendet, und die Parameter verwenden, um eine einfache Enum und ein Parameter-Objekt (von denen beiden Klassen verwenden nur im Datenprojekt) einen IEmailGenerator auszuwählen und damit die E-Mails zu versenden.

Der Manager definiert ist so etwas wie:

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

public interface IEmailGenerator { 
    public EmailType getType(); 
} 

Das Problem ist, werden die Generatoren im UI-Projekt definiert ist, so können sie halten, Wicket Seite Klassen bekommen Dinge wie, den Anforderungszyklus und Anwendungsressourcen . Daher kann ich sie nicht zur Bean im ApplicationContext der Datenprojekte hinzufügen, so dass andere Module in den Daten- und UI-Projekten sie verwenden können.

Gibt es eine Möglichkeit in der application des UI-Projektes wie etwas zu tun:

<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> 

kann ich manuell die Bohnen zusammen in der WicketApplication.init Methode binden würde aber etwas elegantere bevorzugen. Hat jemand so etwas getan?

Verwenden von Feder 4.1.4

Vielen Dank im Voraus.

Antwort

1

Inject Generatoren in mail-notification-service Bohne (zB autowire="byType" verwenden) und registrieren Sie sie direkt nach Bohnen Konstruktion mit init-method (siehe Initialization callbacks im Frühjahr docs)

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) { .. } 
} 

Daten application:

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

UI application:

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

Hallo, danke für deine Antwort. Ich habe es versucht, aber eine NPE in der init-Methode bekommen - die Generatoren sind nicht gesetzt. – fancyplants

+1

Ich habe die Antwort aktualisiert. Verwenden Sie die setzerbasierte Injektion des Felds Generatoren. –

+0

Danke, das hat es funktioniert! Die Spring-Dokumentation sagt nur, dass dies hier getan werden kann: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-autowire - woanders sagen sie, dass wenn mehr als eine Bean passt, dann wird es fehlschlagen. Auch Tabelle 7.2 im Link sagt, dass sich vorher der Guide im Absatz danach korrigiert! – fancyplants