Wenn wir an einem Projekt arbeiten, werden wir einen Hörer verwenden, um Frühlingskonfigurationsdateien zu erhalten und dann die Bohnen herauszunehmen, die wir benötigen. Zum Beispiel, um die Website Homepage zu machen. Unter der Annahme, dass die Hintergrundgeschäftslogik des Produkts gut gemacht wird, müssen wir einen Hörer erstellen und die Homepage -Daten beim Projektstart abfragen und in die Anwendung einbringen, dh die Methode, die Hintergrundprodukt -Geschäftslogik im Hörer aufzurufen, müssen wir die entsprechenden Beans im Frühling im Hörer erhalten. Erstellen Sie zuerst den Hörer:
1. Erstellen Sie einen Initdatalistener
Erstellen Sie einen Hörer initdatalistener erbt servletContextListener:
/** * @Description: Todo (verwendet, um Daten zu initialisieren, wenn das Projekt startet) * @author eson_15 * */// @component // Listener ist eine Komponente der Webschicht. Es wird durch Tomcat instanziiert, nicht durch den Frühling instanziiert. Can't be put in Spring public class InitDataListener implements ServletContextListener { private ProductService productService = null;//productService defines the business logic related to the product @Override public void contextDestroyed(ServletContextEvent event) { } @Override public void contextInitialized(ServletContextEvent event) { } }Und konfigurieren Sie den Hörer in web.xml:
Wie oben erwähnt, wird im ProductService eine Geschäftslogik des Produkts definiert, und dieser Produktservice wird für das Management an den Frühling übergeben. Wie bekommen wir dieses Objekt? Das erste, um sicher zu sein, ist: Wir können es nicht alleine herausholen, denn wenn es herauskommt, hat es nichts mit dem IOC des Frühlings zu tun. Es gibt drei Hauptmethoden, um es zu erreichen. Wir analysieren es einzeln und vergleichen schließlich die Vor- und Nachteile.
2. Laden Sie die Beans.xml -Datei direkt
Diese Methode ist einfach und grob. Müssen Sie die Konfigurationsdatei nicht laden? Ok, ich werde es wie folgt laden:
//@component // Listener ist eine Komponente der Webschicht. Es wird durch Tomcat instanziiert, nicht von Frühling. Kann nicht in die Frühlingsklasse eingebracht werden Initdatalistener implementiert servletContextListener {private productService productService = null; // ProductService definiert die Geschäftslogik im Zusammenhang mit dem Produkt @Override public void contextdestroyed (servletContexEvent Ereignis) {} @Override public void contextInitialized (ServletConteEvent Event) {// die Business Logic Class Products Query Produktinformation contexte = new ClassPlapplicationContex ("xmlContex context = new ClassPlactpathoxMlaplicationContex (" Antragscontex context = new ClassPlictPlaptionContex ("Antragscontex context = New ClassPlicationChtxMlaplicationContex (" AntragsContex. ProductService = (ProductService) Kontext.getBean ("ProductService"); System.out.println (ProductService); // Ausgabe, um festzustellen, ob Sie es erhalten // Folgendes sind die spezifischen Operationen im Zusammenhang mit dem Produktservice ...}}Diese Methode ist völlig in Ordnung und die Idee ist sehr klar. Laden Sie zuerst die Konfigurationsdatei bean.xml und erhalten Sie dann die Bean. Nach dem Start von Tomcat schauen wir uns jedoch die Informationsausgabe von der Konsole an:
Zu diesem Zeitpunkt sollten wir die Nachteile dieser Methode finden. Die Konfigurationsdateien wurden zweimal geladen, was bedeutet, dass diese Bohnen zweimal instanziiert wurden. Nach den gedruckten Informationen zu urteilen, haben wir die Bohnen, die wir die Konfigurationsdateien selbst geladen haben, und wurden so instanziiert. Diese Methode ist offensichtlich unerwünscht.
3. Holen Sie sich vom ServletContext
Aus der obigen Methode können wir zumindest wissen, dass Spring die Konfigurationsdatei einmal über ihren Hörer geladen hat. Wir müssen es nicht wieder laden. Es ist leicht zu glauben, dass wir die Konfigurationsdatei von dort erhalten können, wenn wir wissen, wo die Feder geladen wurde. Schauen wir uns den Prozess des Ladens der Konfigurationsdatei im Frühjahr an:
In der obigen Abbildung (irrelevanter Code wird weggelassen) ist der ContextloaderListener der Spring -Listener, den wir in web.xml konfiguriert haben. Es implementiert auch den ServletContextListener und erbt den Contextloader. Im Hörer wird die Konfigurationsdatei hauptsächlich über die InitWebApplicationContext -Methode erhalten und ein WebApplicationContext -Objekt erstellt. In der initWebApplicationContext -Methode werden zwei wichtige Dinge erledigt: Einer besteht darin, den Federkontext zu erhalten, und der andere besteht darin, den Federkontext in den ServletContext zu setzen, und der Schlüssel ist: webapplicationContext.root_Web_Application_Context_Attribute. Wie bekommt man den Kontext des Frühlings? Es soll den in web.xml konfigurierten Federpfad erhalten. Config_location_parm ist eigentlich eine String -Konstante. Dies ist der folgende konfigurierte Spring -Listener in web.xml:
<Context-Param> <param-name> contextconfigLocation </param-name> <!-config_location_parm ist contextConfigLocation-> <param-value> classPath: beans.xml </param-value> </context-param>
Es ist also offensichtlich, dass Sie Beans.xml über den in web.xml konfigurierten Pfad erhalten, dann diese Konfigurationsdatei laden und die Bean instanziieren.
Jetzt, da wir wissen, dass wir nach dem Laden der Konfigurationsdatei und in den ServletContext sie hier einfügen, können wir hierher gehen und sie direkt bekommen!
//@component // Listener ist eine Komponente der Webschicht. Es wird durch Tomcat instanziiert, nicht von Frühling. Kann nicht in die Frühlingsklasse eingebracht werden Initdatalistener implementiert servletContextListener {private productService productService = null; @Override public void contextdestroyed (ServletConteEvent Ereignis) {// Todo Auto-Generated-Methode Stub} @Override public void contextInitialized (ServletConteEvent Ereignis) {// Business Logic Class-Abfrageinformationen // Lösung 2: Wenn das Projekt gestartet wurde, wird die Frühlingskonfigurationsdatei geladen. Wir müssen es nur im ServletContext erhalten. ApplicationContext context = (ApplicationContext) event.getServletContext () .GetAttribute (WebApplicationContext.root_Web_Application_Context_attribute); ProductService = (ProductService) Kontext.getBean ("ProductService"); System.out.println (ProductService); }} Auf diese Weise können wir das sofortige Objekt des Produzentenservice erhalten. Diese Methode ist gut, aber die Parameter im GetArttribute sind zu lang. Ich weiß nicht, ob die Stirn des Programmierers zu dieser Zeit abgeschnitten wurde. Ich denke, er konnte sich nicht an andere geeignetere Namen vorstellen ~
4. Laden durch die von Spring <br /> bereitgestellte Werkzeugklasse wurde auch die großen Leute, die Spring entwickelten, auch erkannt, dass der Name dieses Parameters zu lang war, sodass sie eine Methodenklasse bereitstellten, mit der die Konfigurationsdatei geladen werden kann:
public class initdatalistener implementiert servletContextListener {private productService productservice = null; @Override public void contextDestroyed (servletContexEvent Ereignis) {// Todo Auto-generierte Methode Stub} @Override public void contextInitialized (servletConteEvent Ereignis) {// Business Logic Class-Produktinformationen WebapplicationContext Context = WebApplicationContextUtils.getWebApplicationContext (Event.getServletContext ()); ProductService = (ProductService) Kontext.getBean ("ProductService"); System.out.println (ProductService); }} In der Tat fasst die GetWebApplicationContext -Methode hier nur die obige Methode zusammen. Schauen wir uns den Quellcode dieser Methode an:
public static webapplicationContext getWebApplicationContext (ServletContext Sc) {return getWebApplicationContext (SC, WebapplicationContext.root_Web_Application_Context_attribute); }Dies ist bequemer für Programmierer, die anrufen können, das ist alles ... daher verwenden wir im Allgemeinen die dritte Methode, um die Konfigurationsdatei von Spring zu erhalten und so die entsprechende sofortige Bean zu erhalten.
Original -Link: http://blog.csdn.net/eson_15/article/details/51373937
Die oben genannte Lösung für den iPhone 6Splus Wechat -Crash. Ich hoffe, es wird für alle hilfreich sein. Ich hoffe auch, dass jeder Wulin.com unterstützt und auf wulin.com mehr aufregende Inhalte aufmerksam macht.