it-swarm.com.de

Wie füge ich im Frühjahr Abhängigkeiten in ein selbst-instanziiertes Objekt ein?

Nehmen wir an, wir haben eine Klasse:

public class MyClass {
    @Autowired private AnotherBean anotherBean;
}

Dann haben wir ein Objekt dieser Klasse erstellt (oder ein anderes Framework hat die Instanz dieser Klasse erstellt).

MyClass obj = new MyClass();

Ist es möglich, die Abhängigkeiten noch zu injizieren? So etwas wie:

applicationContext.injectDependencies(obj);

(Ich denke, Google Guice hat so etwas)

117
Igor Mukhin

Sie können dies mit der autowireBean() -Methode von AutowireCapableBeanFactory tun. Sie übergeben ihm ein beliebiges Objekt, und Spring behandelt es wie etwas, das es selbst erstellt hat, und wendet die verschiedenen Teile der automatischen Verdrahtung an.

Um an den AutowireCapableBeanFactory zu gelangen, verdrahten Sie einfach Folgendes:

private @Autowired AutowireCapableBeanFactory beanFactory;

public void doStuff() {
   MyBean obj = new MyBean();
   beanFactory.autowireBean(obj);
   // obj will now have its dependencies autowired.
}
174
skaffman

Sie können Ihre MyClass auch mit @Configurable-Annotation markieren:

@Configurable
public class MyClass {
   @Autowired private AnotherClass instance
}

Zum Zeitpunkt der Erstellung werden dann automatisch die Abhängigkeiten eingefügt. Sie sollten auch <context:spring-configured/> in Ihrem Anwendungskontext xml.

18
glaz666

Habe gerade das gleiche Bedürfnis und in meinem Fall war es bereits die Logik innerhalb der nicht Spring-verwaltbaren Klasse Java), die Zugriff auf ApplicationContext hatte. Inspiriert von scaffman. Gelöst von:

AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(manuallyCreatedInstance);
3
rand0m86

Ich wollte meine Lösung, die dem @Configurable - Ansatz folgt, als briefly teilen, der in @ glaz666 erwähnt wird Antwort weil

  • Das Antwort von @skaffman ist fast 10 Jahre alt, und das heißt nicht, dass es nicht gut genug ist oder nicht funktioniert
  • Die Antwort von @ glaz666 ist kurz und hat mir nicht wirklich geholfen, mein Problem zu lösen, hat mich aber in die richtige Richtung gelenkt

Mein Setup

  1. Spring Boot 2.0.3 mit Spring Neo4j & Aop starts (Was sowieso irrelevant ist)
  2. Instanziiere eine Bean, wenn Spring Boot Fertig ist, mit dem @Configurable - Ansatz (mit ApplicationRunner)
  3. Gradle & Eclipse

Schritte

Ich musste die folgenden Schritte ausführen, um es zum Laufen zu bringen

  1. Die @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false), die auf Ihrem Bean platziert werden soll und manuell instanziiert werden soll. In meinem Fall hat das Bean, das manuell instanziiert werden soll, @Autowired - Dienste, daher die Requisiten zur obigen Annotation.
  2. Kommentieren Sie die Hauptdatei des Spring Boot XXXApplicaiton.Java (Oder die Datei, die mit @SpringBootApplication Kommentiert ist) mit @EnableSpringConfigured Und @EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
  3. Fügen Sie die Abhängigkeiten in Ihre Build-Datei ein (d. H. Build.gradle oder pom.xml, je nachdem, welche Sie verwenden). compile('org.springframework.boot:spring-boot-starter-aop') und compile('org.springframework:spring-aspects:5.0.7.RELEASE')
  4. Fügen Sie Ihr Bean hinzu, das überall mit @Configurable Kommentiert ist, und seine Abhängigkeiten sollten automatisch verkabelt werden.

* In Bezug auf Punkt 3 ist mir bekannt, dass der org.springframework.boot:spring-boot-starter-aop Transitiv den spring-aop Zieht (wie hier gezeigt mavencentral ), aber in meinem Fall ist die Eclipse fehlgeschlagen Um die @EnableSpringConfigured - Annotationen aufzulösen, habe ich daher zusätzlich zum Starter explizit die spring-aop - Abhängigkeit hinzugefügt. Sollten Sie vor dem gleichen Problem stehen, erklären Sie einfach die Abhängigkeit oder begeben Sie sich auf das Abenteuer, herauszufinden

  • Gibt es einen Versionskonflikt?
  • Warum ist der org.springframework.context.annotation.aspect.* Nicht verfügbar
  • Ist dein IDE richtig eingerichtet?
  • Usw.
2
Raf