Ketika kami sedang mengerjakan proyek, kami akan menggunakan pendengar untuk mendapatkan file konfigurasi pegas, dan kemudian mengeluarkan kacang yang kami butuhkan darinya. Misalnya, untuk membuat beranda situs web. Dengan asumsi bahwa logika bisnis latar belakang produk dilakukan dengan baik, kita perlu membuat pendengar, dan menanyakan data beranda pada startup proyek dan memasukkannya ke dalam aplikasi, yaitu, metode memanggil logika bisnis produk latar belakang dalam pendengar, yaitu, kita perlu mendapatkan kacang yang sesuai yang dikonfigurasi di musim semi di pendengar. Buat pendengar terlebih dahulu:
1. Buat initDataListener
Buat pendengar InitDataSistener mewarisi servletContextListener:
/** * @description: TODO (digunakan untuk menginisialisasi data saat proyek dimulai) * @Author ESON_15 * */// @Component // Pendengar adalah komponen dari lapisan web. Ini dipakai oleh Tomcat, tidak dipakai oleh Spring. 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) { } }Dan konfigurasikan pendengar di web.xml:
Seperti disebutkan di atas, beberapa logika bisnis produk didefinisikan dalam ProductService, dan layanan produk ini diserahkan kepada Spring untuk manajemen. Jadi bagaimana kita mendapatkan objek ini? Hal pertama yang harus dipastikan adalah: kita tidak bisa mengeluarkannya sendiri, karena jika keluar, itu tidak ada hubungannya dengan IOC Spring ... ada tiga cara utama untuk mencapainya. Kami menganalisisnya satu per satu, dan akhirnya membandingkan kelebihan dan kekurangan.
2. Muat file beans.xml secara langsung
Metode ini sederhana dan kasar. Tidakkah Anda perlu memuat file konfigurasi? Oke, saya akan memuatnya, sebagai berikut:
//@komponen // pendengar adalah komponen dari lapisan web. Ini dipakai oleh Tomcat, bukan musim semi. Tidak dapat dimasukkan ke dalam 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) { // Get the business logic class productService query product information ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); ProductService = (ProductService) Context.getBean ("ProductService"); System.out.println (ProductService); // output untuk melihat apakah Anda mendapatkannya // Berikut ini adalah operasi yang berhubungan dengan produk-produk tertentu ...}}Metode ini benar -benar baik -baik saja, dan idenya sangat jelas. Pertama memuat file konfigurasi beans.xml dan kemudian dapatkan kacang. Namun, setelah memulai Tomcat, mari kita lihat output informasi dari konsol:
Pada titik ini, kita harus menemukan kerugian dari metode ini. File konfigurasi dimuat dua kali, yang berarti bahwa kacang itu dipakai dua kali. Dilihat dari informasi yang dicetak, kami mendapatkan kacang yang kami muatkan file konfigurasi sendiri dan dipakai. Metode ini jelas tidak diinginkan.
3. Dapatkan dari ServletContext
Dari metode di atas, kita setidaknya dapat mengetahui bahwa Spring telah memuat file konfigurasi sekali melalui pendengarnya. Kami tidak perlu memuatnya lagi. Sangat mudah untuk berpikir bahwa jika kita tahu di mana pegas telah dimuat, maka kita bisa mendapatkan file konfigurasi dari sana. Mari kita lihat proses memuat file konfigurasi di Spring:
Dalam gambar di atas (kode yang tidak relevan dihilangkan), ContextLoaderListener adalah pendengar musim semi yang kami konfigurasikan di web.xml. Ini juga mengimplementasikan ServletContextListener dan mewarisi ContextLoader. Di pendengar, file konfigurasi terutama diperoleh melalui metode initwebApplicationContext dan membuat objek WebApplicationContext. Dalam metode initwebApplicationContext, dua hal utama dilakukan: satu adalah untuk mendapatkan konteks musim semi, dan yang lainnya adalah memasukkan konteks musim semi ke dalam servletContext, dan kuncinya adalah: webapplicationContext.root_web_application_context_attribute. Jadi bagaimana Anda mendapatkan konteks musim semi? Ini untuk mendapatkan jalur pegas yang dikonfigurasi di web.xml. Config_location_parm sebenarnya adalah konstanta string, yang merupakan pendengar pegas yang dikonfigurasi berikut di web.xml:
<context-param> <Param-name> ContextConfigLocation </param-name> <!-config_location_parm adalah ContextConfigLocation-> <param-value> classpath: beans.xml </param-value> </context-param>
Jadi jelas bahwa Anda mendapatkan beans.xml melalui jalur yang dikonfigurasi di web.xml, kemudian memuat file konfigurasi ini dan membuat instantiate bean.
Sekarang kita tahu bahwa setelah Spring memuat file konfigurasi dan meletakkannya di servletContext, kita bisa pergi ke sini dan mendapatkannya secara langsung!
//@komponen // pendengar adalah komponen dari lapisan web. Ini dipakai oleh Tomcat, bukan musim semi. Tidak dapat dimasukkan ke dalam Spring Public Class InitDataListener Implements ServletContextListener {private ProductService ProductService = null; @Override public void contextDestroyed(ServletContextEvent event) { // TODO Auto-generated method stub } @Override public void contextInitialized(ServletContextEvent event) { // Get business logic class query product information// Solution 2: When the project is started, the Spring configuration file is loaded through the Spring listener and stored in the ServletContext. Kita hanya perlu mendapatkannya di ServletContext. ApplicationContext Context = (ApplicationContext) Event.GetSerVletContext () .GetAttribute (WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATtribute); ProductService = (ProductService) Context.getBean ("ProductService"); System.out.println (ProductService); }} Dengan cara ini, kita bisa mendapatkan objek instantiated dari produsenService. Metode ini bagus, tetapi parameter dalam getAttribute terlalu lama. Saya tidak tahu apakah dahi programmer terpotong pada waktu itu. Saya kira dia tidak bisa memikirkan nama lain yang lebih cocok ~
4. Memuat melalui kelas alat yang disediakan oleh Spring <br /> Mungkin orang -orang besar yang mengembangkan Spring juga menyadari bahwa nama parameter ini terlalu panjang, sehingga mereka menyediakan kelas metode yang dapat memuat file konfigurasi:
Public Class InitDataListener mengimplementasikan servletContextListener {private productservice productservice = null; @Override public void contextDestroyed(ServletContextEvent event) { // TODO Auto-generated method stub } @Override public void contextInitialized(ServletContextEvent event) { // Get business logic class query product information WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()); ProductService = (ProductService) Context.getBean ("ProductService"); System.out.println (ProductService); }} Bahkan, metode GetWebApplicationContext di sini hanya merangkum metode di atas. Mari kita lihat kode sumber dari metode ini:
public static WebApplicationContext getWebApplicationContext (servletContext sc) {return getWebApplicationContext (sc, webapplicationContext.root_web_application_context_attribute); }Ini lebih nyaman bagi programmer untuk dihubungi, itu saja ... jadi kami biasanya menggunakan metode ketiga untuk mendapatkan file konfigurasi Spring, sehingga mendapatkan kacang instantiated yang sesuai.
Tautan asli: http://blog.csdn.net/eson_15/article/details/51373937
Di atas adalah solusi untuk crash iPhone 6splus WeChat. Saya harap ini akan membantu semua orang. Saya juga berharap semua orang akan mendukung wulin.com dan lebih memperhatikan konten yang lebih menarik di wulin.com.