Ich möchte eine Standalone-Anwendung mit IOC schreiben, wie benutze ich die Quellabhängigkeitsinjektion dort? Ich benutze JIdea. Es gibt Frühling 2.5 Unterstützung, aber ich möchte Frühling 3.0 verwenden, ist hier die Art, wie ich versuchte!
Ich erfahre bei der Verwendung von Spring MVC Abhängigkeiten in einem WebApplicationContext, aber wie injiziere ich Abhängigkeiten in eine eigenständige Anwendung
Ich habe das versucht
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"com\ttg\xmlfile.xml"});
aber ich kann nicht sehen, dass die Abhängigkeiten von den dort definierten Beans (in der XML-Datei) injiziert werden. Ich habe den obigen Code in die main-Methode und zwei Bean-Definitionen für zwei Objekte eingefügt, in einem Konstruktor der Java-Klasse habe ich das Objekt der anderen Klasse verwendet - das in dieses Objekt injiziert wurde - und eine Methode aufgerufen, die etwas ausgibt, aber nicht Es hat nicht funktioniert Ich dachte, dass der obige Code alle Abhängigkeiten erzeugt und injiziert, aber es scheint nicht so zu sein
Wie verwende ich Springs IOC, Abhängigkeitsinjektion in meiner Stand-alone-App, die keinen WebApplicationContext enthält?
Bitte nennen Sie Schritte.
Angenommen, Sie haben:
%Vor%Die Datei context.xml
%Vor%dann sollte das wahr sein
%Vor%Sie können die von spring zur Verfügung gestellte Autowinding-Unterstützung verwenden, um Abhängigkeiten (und möglicherweise Postprozessoren) auf ein Objekt anzuwenden, das nicht zum Anwendungskontext gehört.
In Ihrem Fall ist dieses Objekt Ihre eigenständige Anwendung.
Hier ist der Weg, dies zu erreichen. In diesem Beispiel verwende ich @Autowired (für b1), traditionelles DI (für b2) und Initialisierungs-Hook für b3. Die Autowinding-Unterstützung mit Anmerkungen geht davon aus, dass Sie in Ihrem Anwendungskontext den entsprechenden Spring-Postprozessor definiert haben (z. B. durch Deklaration von <context:annotation-config/>
).
In diesem Beispiel sollten alle b1, b2 und b3 nicht null sein (vorausgesetzt, b1 und b2 sind in Ihrem Anwendungskontext vorhanden).
Ich habe es nicht getestet (vielleicht nicht einmal aufgrund eines Tippfehlers kompilieren), aber die Idee ist in den letzten 3 Zeilen. Siehe die Javadocs für AutowireCapableBeanFactory
und erwähnte Methoden, um genau zu sehen, was passiert.
Wenn Sie (hauptsächlich) reines Java bevorzugen, können Sie java config:
verwenden %Vor%Und dann instanziieren:
%Vor%Denken Sie daran, dass es einige Dinge gibt, die die reine Annotations-gesteuerte Konfiguration noch nicht unterstützt (wie Dinge wie tx: annotation-driven), für die Sie vielleicht etwas XML-Code benötigen.
%Vor%Und dann verwenden Sie eine Standard-XML-basierte Methode zum Erstellen des ApplicationContext (wie ClasspathXmlApplicationContext, oder der Spring Web Context Loader, etc ...).
Wie haben Sie bestätigt, dass Ihre Bohnen nicht richtig verkabelt sind? Ein häufiges Problem ist, dass die XML-Konfigurationsdatei nicht an der richtigen Stelle ist. Können Sie uns weitere Informationen geben, z. B. Ihr Projektlayout und den Code, mit dem Sie die Beans aus dem Container erhalten?
Wenn Sie die log4j-Protokollierung zu Ihrer App hinzufügen, sollten Sie eine Kaskade von Nachrichten sehen, die Ihnen viel darüber erzählen, was Spring ist und was nicht. Wenn Sie dieses Feedback nicht haben, sind Sie im Dunkeln. Sie können die Antwort vielleicht herausfinden, indem Sie mehr Informationen aus Log4j herausholen.
Rufen Sie context.getBean("beanName")
an, um einen Verweis auf die Bean zu erhalten, oder machen Sie eine new SomeClass()
? Wenn Sie dies über getBean()
tun, sollten die injizierten Eigenschaften festgelegt werden.
Stellen Sie außerdem sicher, dass Sie dieselbe Bean-Factory (ClassPathXmlApplicationContext-Instanz) zum Abrufen aller Ihrer Beans verwenden. Dies sollte höchstwahrscheinlich statisch sein und von der gesamten Anwendung verwendet werden.
Tags und Links java spring dependency-injection inversion-of-control