Jak wprowadzić zależności do samodzielnego obiektu na wiosnę?
Powiedzmy, że mamy klasę:
public class MyClass {
@Autowired private AnotherBean anotherBean;
}
Następnie stworzyliśmy obiekt tej klasy (lub jakiś inny framework stworzył instancję tej klasy).
MyClass obj = new MyClass();
Czy można nadal wprowadzać zależności? Coś w stylu:
applicationContext.injectDependencies(obj);
(myślę, że Google Guice ma coś takiego)
5 answers
Możesz to zrobić za pomocą autowireBean()
Metody AutowireCapableBeanFactory
. Przekazujesz go dowolnemu obiektowi, a Spring potraktuje go jak coś, co sam stworzył i zastosuje różne autowirujące kawałki i kawałki.
Aby zdobyć AutowireCapableBeanFactory
, wystarczy autowire że:
private @Autowired AutowireCapableBeanFactory beanFactory;
public void doStuff() {
MyBean obj = new MyBean();
beanFactory.autowireBean(obj);
// obj will now have its dependencies autowired.
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-28 14:21:56
Możesz również oznaczyć MyClass adnotacją @ Configurable:
@Configurable
public class MyClass {
@Autowired private AnotherClass instance
}
Następnie w czasie tworzenia automatycznie wprowadzi swoje zależności. Powinieneś również mieć <context:spring-configured/>
w kontekście aplikacji xml.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-20 14:53:05
Właśnie miałem taką samą potrzebę i w moim przypadku była to już logika wewnątrz klasy Java Non Spring manageable, która miała dostęp do ApplicationContext
. Zainspirowany rusztowaniem.
Rozwiązane przez:
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(manuallyCreatedInstance);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-16 21:58:35
Chciałem podzielić się moim rozwiązaniem, które podąża za podejściem @Configurable
jak briefly
wspomniano w @glaz666 odpowiedź ponieważ
- W 2014 roku, w ramach programu "Horyzont 2020", w ramach programu "Horyzont 2020", w ramach programu "Horyzont 2020" - programu ramowego w zakresie badań naukowych i innowacji (2014-2020), zrealizowano]}
Odpowiedź @glaz666 jest krótka i nie pomogła mi rozwiązać mojego problemu, ale wskazała mi właściwy kierunek.]}
Moja konfiguracja
- Spring Boot 2.0.3 z
Spring Neo4j & Aop starts
(co jest nieistotne anyway)
W ten sposób możliwe jest tworzenie kopii zapasowych, a także tworzenie kopii zapasowych.]}
- Gradle & Eclipse
Kroki
Musiałem wykonać poniższe kroki, aby to zadziałało
-
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)
, który ma być umieszczony na TwoimBean
, który ma być ręcznie utworzony. W moim przypadkuBean
, które ma być ręcznie utworzone mają@Autowired
usługi stąd, właściwości do powyższej adnotacji. - Adnotacja Główna sprężyny
XXXApplicaiton.java
(lub Plik z adnotacją@SpringBootApplication
) z@EnableSpringConfigured
i@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
- Dodaj zależności do pliku kompilacji (np.gradle lub pom.xml w zależności od tego, którego z nich używasz)
compile('org.springframework.boot:spring-boot-starter-aop')
icompile('org.springframework:spring-aspects:5.0.7.RELEASE')
- New + up your {[7] } który jest przypisywany
@Configurable
w dowolnym miejscu i jego zależności powinny być autowirowane.
*w odniesieniu do punktu #3 powyżej, zdaję sobie sprawę, że org.springframework.boot:spring-boot-starter-aop
przelotnie pociąga spring-aop
(Jak pokazano tutaj mavencentral ), ale w moim przypadku zaćmienie nie udało się rozwiąż adnotacje @EnableSpringConfigured
stąd, dlaczego jawnie dodałem zależność spring-aop
oprócz startera. Jeśli napotkasz ten sam problem, po prostu zadeklaruj zależność lub wyrusz na przygodę z wymyślaniem]}
- czy istnieje konflikt wersji
- dlaczego
org.springframework.context.annotation.aspect.*
nie jest dostępna
Czy Twoja konfiguracja IDE jest prawidłowa?]}
- itd.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-19 19:06:12
Nie bez obejścia, ponieważ Spring nic nie wie o tym przypadku.
Prawdziwe pytanie brzmi: dlaczego tworzysz instancje klasy, do której chcesz ręcznie wstrzykiwać zależności, zamiast pozwolić Spring ' owi je kontrolować? Dlaczego klasa nie używa MyClass
i nie wstrzykuje do niej MyClass
?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-28 14:09:28