2016-01-31 12 views
10

Chcę utworzyć bobik sprężynowy w konfiguracji wiosna java z niektórymi argumentami konstruktora przekazanymi w środowisku wykonawczym. Mam utworzyć następujące Java config, w którym istnieje fasola fixedLengthReport, które oczekują niektórych argumentów w konstruktorze.Fasola sprężysta z argumentami konstruktora wykonawczego

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

ale otrzymuję błąd, który sourceSystem nie mógł drut ponieważ nie znaleziono żadnych fasoli. Jak mogę utworzyć komponent bean za pomocą argumentów konstruktora środowiska wykonawczego?

Używam sprężynę 4,2

+0

Gdzie zdefiniowałeś ziarno 'SourceSystem'? – user2004685

+0

SourceSystem nie jest fasolą wiosenną. Powiedzmy, że jest to tylko ciąg znaków, a jego wartość jest określana w czasie wykonywania. Mam zaktualizowane moje pytanie –

+0

Czy możesz zapewnić implementację 'TdctFixedLengthReport'? – user2004685

Odpowiedz

12

Można użyć następny Aproach:

@Configuration 
Public AppConfig { 

    @Autowired 
    Dao dao; 

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

@Lazy oznacza, że ​​sprężyna nie będzie instancję tej fasoli prawo na początku, ale to zrobi później na żądanie. Teraz, aby uzyskać instancję tej fasoli trzeba zrobić:

@Controller 
public class ExampleController{ 

    @Autowired 
    private BeanFactory beanFactory; 

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

Uwaga, ze względu na swoją fasola nie może być instancja na początku, nie musi autowire swoją fasolkę bezpośrednio. W przeciwnym razie @Lazy adnotacja zostanie zignorowana, a Spring spróbuje samodzielnie utworzyć instancję komponentu bean. Następne użycie spowoduje błąd:

@Controller 
public class ExampleController{ 

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

} 
+1

proszę zmienić literówkę w adnotacji "@ Autowire". (i tak, to podsunęło mi DUŻO!);)) – Dominik

+0

@Dominik thanx dużo. Następnym razem możesz edytować mój post, jeśli znajdziesz te same literówki.) –

+0

Wydaje się, że edycja musi edytować co najmniej 6 znaków, przynajmniej tak mi się stało, gdy próbowałem edytować pytanie (1 znak) i twój wpis (3 znaki edytowane) :-) – Dominik

2

kod wygląda dobrze, aby uzyskać prototyp z parametrów należy BeanFactory # getBean (String name, Object ... args) metody.

Spójrz na Spring Java Config: how do you create a prototype-scoped @Bean with runtime arguments? BeanFactory # getBean (nazwa łańcucha, obiekt ... args) będzie tym, czego szukasz.

Domyślam się, że IDEA (w moim przypadku IntelliJ IDEA wersja 15.) daje błąd i nie jest to błąd czasu wykonywania/kompilacji.

W IntelliJ można zmienić ustawienie inspekcji wiosennych.

  • Przejdź do pliku -> ustawienia.
  • Wpisz inspekcje w polu wyszukiwania.
  • Przejdź do Spring Core-> Code-> Autowire dla klas fasoli.
  • Zmiana z "Error" do „słabej ostrzeżenie”
+0

Prawidłowo, używam wersji pomysłu 15, więc może to być spowodowane tym. Chciałbym zmienić ustawienia, aby je usunąć. Dzięki za pomoc, Haim. –

Powiązane problemy