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)

Author: Igor Mukhin, 2010-09-28

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.
}
 155
Author: skaffman,
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.

 18
Author: glaz666,
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);
 2
Author: rand0m86,
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

  1. Spring Boot 2.0.3 z Spring Neo4j & Aop starts (co jest nieistotne anyway)
  2. W ten sposób możliwe jest tworzenie kopii zapasowych, a także tworzenie kopii zapasowych.]}
  3. Gradle & Eclipse

Kroki

Musiałem wykonać poniższe kroki, aby to zadziałało

  1. @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false), który ma być umieszczony na Twoim Bean, który ma być ręcznie utworzony. W moim przypadku Bean, które ma być ręcznie utworzone mają @Autowired usługi stąd, właściwości do powyższej adnotacji.
  2. Adnotacja Główna sprężyny XXXApplicaiton.java (lub Plik z adnotacją @SpringBootApplication) z @EnableSpringConfigured i @EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
  3. 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') i compile('org.springframework:spring-aspects:5.0.7.RELEASE')
  4. 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.
 1
Author: Raf,
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?

 -5
Author: matt b,
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