Spring - Verwendung von Spring Dependency Injection zum Schreiben einer eigenständigen Java-Anwendung

8

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.

    
Buddhi 14.05.2009, 19:11
quelle

7 Antworten

17

Angenommen, Sie haben:

%Vor%

Die Datei context.xml

%Vor%

dann sollte das wahr sein

%Vor%     
Mihai Toader 14.05.2009, 22:44
quelle
9

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/> ).

%Vor%

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.

    
Gaetan 20.10.2009 06:49
quelle
2

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 ...).

    
Matt 13.07.2012 18:40
quelle
1

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?

    
neesh 14.05.2009 20:30
quelle
0

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.

    
duffymo 14.05.2009 23:37
quelle
0

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.

    
Taylor Leese 14.05.2009 19:25
quelle
0

Sie können den Befehl @Autowired

verwenden     
jpganz18 13.07.2012 16:45
quelle