Pengenalan kepada Spring ClassPathXmlApplicationContext

1. Gambaran keseluruhan

Inti Kerangka Spring adalah, wadah IoC yang digunakan untuk menguruskan kacang.

Terdapat dua jenis bekas asas pada musim bunga - Kilang Kacang dan Konteks Aplikasi. Yang pertama menyediakan fungsi asas, yang diperkenalkan di sini; yang terakhir adalah superset dari yang pertama dan paling banyak digunakan.

ApplicationContext adalah antara muka dalam pakej org.springframework.context dan ia mempunyai beberapa pelaksanaan, dan ClassPathXmlApplicationContext adalah salah satunya.

Dalam artikel ini, kami akan memberi tumpuan kepada fungsi berguna yang disediakan oleh ClassPathXmlApplicationContext .

2. Penggunaan Asas

2.1. Memulakan Bekas dan Mengurus Kacang

ClassPathXmlApplicationContext dapat memuat konfigurasi XML dari classpath dan menguruskan kacang:

Kami mempunyai kelas Pelajar :

public class Student { private int no; private String name; // standard constructors, getters and setters }

Kami mengkonfigurasi kacang Pelajar dalam classpathxmlaplikasicontext-example.xml dan menambahkannya ke dalam classpath:

Sekarang kita boleh menggunakan ClassPathXmlApplicationContext untuk memuat konfigurasi XML dan mendapatkan kacang Pelajar :

@Test public void testBasicUsage() { ApplicationContext context = new ClassPathXmlApplicationContext( "classpathxmlapplicationcontext-example.xml"); Student student = (Student) context.getBean("student"); assertThat(student.getNo(), equalTo(15)); assertThat(student.getName(), equalTo("Tom")); Student sameStudent = context.getBean("student", Student.class); assertThat(sameStudent.getNo(), equalTo(15)); assertThat(sameStudent.getName(), equalTo("Tom")); }

2.2. Pelbagai Konfigurasi XML

Kadang-kadang kita mahu menggunakan beberapa konfigurasi XML untuk memulakan wadah Spring. Sekiranya demikian, kita hanya perlu menambahkan beberapa lokasi konfigurasi semasa membina ApplicationContext :

ApplicationContext context = new ClassPathXmlApplicationContext("ctx.xml", "ctx2.xml");

3. Keupayaan Tambahan

3.1. Tutup Bekas Spring IoC dengan Anggun

Apabila kita menggunakan wadah Spring IoC dalam aplikasi web, implementasi ApplicationContext berbasis web Spring akan mematikan wadah dengan baik ketika aplikasi ditutup, tetapi jika kita menggunakannya dalam lingkungan non-web, seperti aplikasi desktop yang berdiri sendiri, kita perlu mendaftar kait penutupan dengan JVM sendiri untuk memastikan kontena Spring IoC ditutup dengan anggun dan memanggil kaedah pemusnahan untuk melepaskan sumber.

Mari tambahkan kaedah menghancurkan () ke kelas Pelajar :

public void destroy() { System.out.println("Student(no: " + no + ") is destroyed"); }

Kita sekarang boleh mengkonfigurasi kaedah ini sebagai kaedah menghancurkan kacang pelajar :

Kami sekarang akan mendaftarkan cangkuk penutupan:

@Test public void testRegisterShutdownHook() { ConfigurableApplicationContext context = new ClassPathXmlApplicationContext( "classpathxmlapplicationcontext-example.xml"); context.registerShutdownHook(); }

Apabila kita menjalankan kaedah ujian, kita dapat melihat kaedah menghancurkan () dipanggil.

3.2. Pengantarabangsaan dengan MessageSource

The ApplicationContext muka memanjangkan MessageSource antara muka, oleh itu menyediakan fungsi pengantarabangsaan.

An ApplicationContext bekas secara automatik carian untuk MessageSource kacang dalam pengawalan, dan kacang harus dinamai sebagai messageSource .

Berikut adalah contoh penggunaan bahasa yang berbeza dengan MessageSource :

Pertama, mari tambah direktori dialog ke classpath dan tambahkan dua fail ke dalam direktori dialog: dialog_en.properties dan dialog_zh_CN.properties .

dialog_en.properties :

hello=hello you=you thanks=thank {0}

dialog_zh_CN. sifat :

hello=\u4f60\u597d you=\u4f60 thanks=\u8c22\u8c22{0}

Konfigurasikan messageSource bean dalam classpathxmlaplikasicontext-internationalization.xml :

    dialog/dialog    

Kemudian, mari dapatkan kata-kata dialog bahasa yang berbeza dengan MessageSource :

@Test public void testInternationalization() { MessageSource resources = new ClassPathXmlApplicationContext( "classpathxmlapplicationcontext-internationalization.xml"); String enHello = resources.getMessage( "hello", null, "Default", Locale.ENGLISH); String enYou = resources.getMessage( "you", null, Locale.ENGLISH); String enThanks = resources.getMessage( "thanks", new Object[] { enYou }, Locale.ENGLISH); assertThat(enHello, equalTo("hello")); assertThat(enThanks, equalTo("thank you")); String chHello = resources.getMessage( "hello", null, "Default", Locale.SIMPLIFIED_CHINESE); String chYou = resources.getMessage( "you", null, Locale.SIMPLIFIED_CHINESE); String chThanks = resources.getMessage( "thanks", new Object[] { chYou }, Locale.SIMPLIFIED_CHINESE); assertThat(chHello, equalTo("你好")); assertThat(chThanks, equalTo("谢谢你")); }

4. Rujukan kepada ApplicationContext

Kadang-kadang kita perlu mendapatkan rujukan ApplicationContext di dalam kacang yang diuruskannya, kita boleh menggunakan ApplicationContextAware atau @Autowired untuk melakukan ini. Mari lihat bagaimana penggunaan ApplicationContextAware berfungsi:

Kami mempunyai kelas Kursus dengan nama:

public class Course { private String name; // standard constructors, getters and setters }

Kami mempunyai kelas Guru yang mengumpulkan kursus mengikut kacang kontena:

public class Teacher implements ApplicationContextAware { private ApplicationContext context; private List courses = new ArrayList(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.context = applicationContext; } @PostConstruct public void addCourse() { if (context.containsBean("math")) { Course math = context.getBean("math", Course.class); courses.add(math); } if (context.containsBean("physics")) { Course physics = context.getBean("physics", Course.class); courses.add(physics); } } // standard constructors, getters and setters }

Mari konfigurasikan kacang kursus dan kacang guru di classpathxmlaplikasicontext-example.xml :

Kemudian - uji suntikan harta kursus :

@Test public void testApplicationContextAware() { ApplicationContext context = new ClassPathXmlApplicationContext( "classpathxmlapplicationcontext-example.xml"); Teacher teacher = context.getBean("teacher", Teacher.class); List courses = teacher.getCourses(); assertThat(courses.size(), equalTo(1)); assertThat(courses.get(0).getName(), equalTo("math")); }

Selain melaksanakan antara muka ApplicationContextAware , penggunaan anotasi @Autowired mempunyai kesan yang sama.

Mari ubah kelas Guru kepada ini:

public class Teacher { @Autowired private ApplicationContext context; private List courses = new ArrayList(); @PostConstruct public void addCourse() { if (context.containsBean("math")) { Course math = context.getBean("math", Course.class); courses.add(math); } if (context.containsBean("physics")) { Course physics = context.getBean("physics", Course.class); courses.add(physics); } } // standard constructors, getters and setters }

Kemudian jalankan ujian itu, kita dapat melihat hasilnya sama.

5. Kesimpulan

ApplicationContext adalah wadah Spring dengan lebih banyak fungsi khusus perusahaan berbanding dengan BeanFactory , dan ClassPathXmlApplicationContext adalah salah satu pelaksanaannya yang paling sering digunakan.

Oleh itu, dalam artikel ini, kami memperkenalkan beberapa aspek ClassPathXmlApplicationContext , termasuk penggunaan asasnya, fungsi pendaftaran penutupan, fungsi pengantarabangsaannya dan mendapatkan rujukannya.

Seperti biasa, kod sumber lengkap untuk contoh boleh didapati di GitHub.