2016-01-31 14 views
10

Ich möchte eine Spring Bean in Spring Java-Konfiguration mit einigen Konstruktor Argumente zur Laufzeit übergeben. Ich habe folgende Java-Konfiguration, in der es eine Bean FixedLengthReport gibt, die einige Argumente im Konstruktor erwarten.Spring Bean mit Laufzeitkonstruktor Argumenten

@Configuration 
Public AppConfig { 

@Autowrire 
Dao dao; 

@Bean 
@Scope(value = "prototype") 
**//SourceSystem can change at runtime** 
public FixedLengthReport fixedLengthReport(String sourceSystem) { 
     return new TdctFixedLengthReport(sourceSystem, dao); 
} 

Aber ich bin immer Fehler, dass sourceSystem konnte nicht Draht, weil keine Bohne gefunden. Wie kann ich Bean mit Laufzeitkonstruktorargumenten erstellen?

I Feder Code 4.2

+0

Wo haben Sie die Bean von 'SourceSystem' definiert? – user2004685

+0

SourceSystem ist keine Frühlingsbohne. Sagen wir, es ist nur eine Zeichenkette und ihr Wert wird zur Laufzeit bestimmt. Ich habe meine Frage aktualisiert –

+0

Können Sie die Implementierung von 'TdctFixedLengthReport' bereitstellen? – user2004685

Antwort

12

Sie neben aproach verwenden kann:

@Configuration 
Public AppConfig { 

    @Autowired 
    Dao dao; 

    @Bean 
    @Scope(value = "prototype") 
    @Lazy(value = true) 
    public FixedLengthReport fixedLengthReport(String sourceSystem) { 
     return new TdctFixedLengthReport(sourceSystem, dao); 
    } 
} 

@Lazy bedeutet, dass Frühling wird diese Bohne direkt am Anfang nicht instanziiert, aber wird es tun später auf Anfrage. Nun bekommen Instanz dieser Bohne Sie müssen als nächstes tun:

@Controller 
public class ExampleController{ 

    @Autowired 
    private BeanFactory beanFactory; 

    @RequestMapping("/") 
    public String exampleMethod(){ 
     TdctFixedLengthReport report = 
     beanFactory.getBean(TdctFixedLengthReport.class, "sourceSystem"); 
    } 
} 

Hinweis, wegen Ihrer Bean nicht auf Start instanziiert werden kann, müssen Sie nicht direkt autowire Ihre Bohne. Andernfalls wird @Lazy-Annotation ignoriert und Spring versucht, eine Bean-Instanz selbst zu erstellen. Die nächste Verwendung verursacht einen Fehler:

@Controller 
public class ExampleController{ 

    //next declaration will cause ERROR 
    @Autowired 
    private TdctFixedLengthReport report; 

} 
+1

Bitte ändern Sie den Tippfehler in '@ Autowire' Annotation. (Und ja, das nervte mich sehr!;)) – Dominik

+0

@Dominik vielen Dank. Nächstes Mal kannst du meinen Beitrag bearbeiten, wenn du die gleichen Tippfehler findest.) –

+0

Scheint eine Bearbeitung muss mindestens 6 Zeichen bearbeiten, zumindest das ist, was passiert ist, als ich versuchte, die Frage zu bearbeiten (1 Char) und Ihre Post (3 Zeichen bearbeitet) :-) – Dominik

2

Sie verwende sieht gut aus, den Prototyp zu bekommen mit den Parametern der BeanFactory # getBean verwenden (String name, Object ... args) -Methode.

Betrachten Sie Spring Java Config: how do you create a prototype-scoped @Bean with runtime arguments? BeanFactory # getBean (String-Name, Objekt ... Args) wäre was Sie suchen.

Ich denke, dass Ihre IDEA (in meinem Fall IntelliJ IDEA Version 15.) Ihnen den Fehler gibt, und es ist kein Laufzeit-/Kompilierzeitfehler.

In IntelliJ können Sie die Einstellung der Federprüfungen ändern.

  • Gehen Sie zu Datei -> Einstellungen.
  • Geben Sie Inspektionen in das Suchfeld ein.
  • Gehen Sie zu Spring Core-> Code-> Autowire für Bean-Klassen.
  • Wechsel von „Fehlern“ auf „schwache Warnung“
+0

Richtig, ich benutze Idee Version 15, so könnte es daran liegen. Ich würde die Einstellungen ändern, um es zu entfernen. Danke für deine Hilfe Haim. –