Witajcie,
Potrzebuję utworzyć nową instancję obiektu z poziomu kodu Java. Problem w tym, że obiekt ten zawiera pola z adnotacjami @Autowired w które muszą być injectowane springowe beany. Jak to zrobić? Myślałem o użyciu scope=prototype i pobraniu beana z kontenera IoC, ale nie jestem przekonany czy to najlepszy pomysł.
ale przecież... jak masz prototype to i tak definiujesz w xml'u więc nie robisz tego z poziomu javy, jedyny problem jaki może się pojawić mixując beany z różnych scopów to kiedy masz request scope i singleton scope - obchodzi to przez scoped-proxy.
Ty chcesz zarejestrować nowego beana z poziomy javy ? możesz to zrobić: http://random-thoughts-vortex.blogspot.com/2009/03/create-dynamically-spring-beans.html
Potrzebuję utworzyć nową instancję obiektu z poziomu kodu Java.
Z tego co zrozumiałem chcesz zrobić new MojObiekt(); A w srodku masz pola @Autowired. I chcesz uzyskac do nich dostęp. Jednak Spring nie zarządza obiektem stworzonym za pomocą (new). Pola obecnie są null, a chcesz mieć referencje do prawdziwych obiektów (np. springowego service / singletona).
Może zastosować następujące podejście:
- usunąć @Autowired w problematycznym obiekcie (jeśli nie musi być tworzony przez fabryki springowe w innym miejscu)
- wstrzyknąć potrzebne referencje przez konstruktor w new MojObiekt(ref1,ref2) (wczesniej pobierajac je z fabryki w zarzadzalnym obiekcie, gdzie dokonywane jest tworzenie lub w ostatecznosci z kontekstu po nazwie)
- ten sam pomysl rownie dobrze mozna zrealizowac na setterach tzn. do MojObiekt dodac settery i przed jego uzyciem manualnie wstrzyknac referencje do obiektow stworzonych przez fabryki
Można zrobić to tak:
http://stackoverflow.com/a/1377740
ApplicationContext ctx = ...
YourClass someBeanNotCreatedBySpring = ...
ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
someBeanNotCreatedBySpring,
AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true);
ale zastanowiłbym się czy to jest naprawdę konieczne.