2016-01-31 1 views
10

Je veux créer un haricot de printemps dans configuration java de printemps avec certains arguments constructeur passés à l'exécution. J'ai créé la config java suivante dans laquelle il y a un bean fixedLengthReport qui attend quelques arguments dans le constructeur.Bean de printemps avec les arguments du constructeur d'exécution

@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); 
} 

Mais je reçois erreur sourceSystem ne pouvait pas le fil, car aucun haricot trouvé. Comment puis-je créer un bean avec des arguments constructeurs d'exécution?

J'utilise le code source 4.2

+0

Où avez-vous défini le bean de 'SourceSystem'? – user2004685

+0

SourceSystem n'est pas un haricot de printemps. Disons que c'est juste une chaîne et que sa valeur est déterminée au moment de l'exécution. J'ai mis à jour ma question –

+0

Pouvez-vous fournir l'implémentation de 'TdctFixedLengthReport'? – user2004685

Répondre

12

Vous pouvez utiliser la prochaine aproche:

@Configuration 
Public AppConfig { 

    @Autowired 
    Dao dao; 

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

@Lazy signifie, que le printemps ne sera pas instancier ce haricot droit au démarrage, mais le faire plus tard sur demande. Maintenant, pour obtenir par exemple de ce haricot que vous avez à faire:

@Controller 
public class ExampleController{ 

    @Autowired 
    private BeanFactory beanFactory; 

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

Note, en raison de votre haricot ne peut pas être instancié au démarrage, vous ne devez pas lier automatiquement votre haricot directement. Sinon, l'annotation @Lazy sera ignorée et Spring essaiera de créer une instance de bean par lui-même. La prochaine utilisation provoquera une erreur:

@Controller 
public class ExampleController{ 

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

} 
+1

s'il vous plaît changer la faute de frappe dans «@ Autowire» Annotation. (et oui, cela m'a beaucoup embêté!;)) – Dominik

+0

@Dominik merci beaucoup. La prochaine fois, n'hésitez pas à modifier mon post, si vous trouvez les mêmes fautes de frappe. –

+0

Semble une édition doit éditer au moins 6 caractères, au moins c'est ce qui m'est arrivé quand j'ai essayé d'éditer la question (1 caractère) et votre message (3 caractères édités) :-) – Dominik

2

Vous semble bien, pour obtenir le prototype avec des paramètres utilisent la méthode BeanFactory # getBean (nom String, Object ... args).

Regardez Spring Java Config: how do you create a prototype-scoped @Bean with runtime arguments? BeanFactory # getBean (nom de chaîne, Object ... args) serait ce que vous recherchez.

Je suppose que votre IDEA (dans mon cas IntelliJ IDEA version 15.) vous donne l'erreur et ce n'est pas une erreur d'exécution/temps de compilation.

Dans IntelliJ, vous pouvez modifier le réglage des inspections de ressort.

  • Allez dans le fichier -> paramètres.
  • Inspections de type dans la zone de recherche.
  • Accédez à Spring Core-> Code-> Autowire pour les classes Bean.
  • Changement de « erreur » à « avertissement faible »
+0

Correct, j'utilise l'idée de la version 15 donc ça pourrait être à cause de ça. Je voudrais changer les paramètres pour l'enlever. Merci pour votre aide Haim. –