Pengantar Spring ClassPathXmlApplicationContext

1. Ikhtisar

Inti Spring Framework adalah, sederhananya, wadah IoC yang digunakan untuk mengelola kacang.

Ada dua tipe dasar container di Spring - Bean Factory dan Application Context. Yang pertama menyediakan fungsionalitas dasar, yang diperkenalkan di sini; yang terakhir adalah superset dari yang pertama dan paling banyak digunakan.

ApplicationContext adalah antarmuka dalam paket org.springframework.context dan memiliki beberapa implementasi, dan ClassPathXmlApplicationContext adalah salah satunya.

Dalam artikel ini, kita akan fokus pada fungsi berguna yang disediakan oleh ClassPathXmlApplicationContext .

2. Penggunaan Dasar

2.1. Inisialisasi Wadah dan Kelola Kacang

ClassPathXmlApplicationContext dapat memuat konfigurasi XML dari classpath dan mengelola kacangnya:

Kami memiliki kelas pelajar :

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

Kami mengkonfigurasi kacang Mahasiswa di classpathxmlapplicationcontext-example.xml dan menambahkannya ke classpath:

Sekarang kita dapat menggunakan ClassPathXmlApplicationContext untuk memuat konfigurasi XML dan mendapatkan kacang Student :

@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. Beberapa Konfigurasi XML

Terkadang kami ingin menggunakan beberapa konfigurasi XML untuk menginisialisasi container Spring. Dalam hal ini, kita hanya perlu menambahkan beberapa lokasi konfigurasi saat membuat ApplicationContext :

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

3. Kemampuan Tambahan

3.1. Matikan Container IoC Spring dengan Baik

Saat kami menggunakan container IoC Spring dalam aplikasi web , implementasi ApplicationContext berbasis web Spring akan mematikan container dengan baik saat aplikasi ditutup, tetapi jika kami menggunakannya di lingkungan non-web, seperti aplikasi desktop mandiri, kami harus mendaftarkan sendiri hook shutdown dengan JVM untuk memastikan container Spring IoC dimatikan dengan baik dan memanggil metode penghancuran untuk melepaskan resource.

Mari tambahkan metode destroy () ke kelas Siswa :

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

Sekarang kita dapat mengkonfigurasi metode ini sebagai metode penghancuran kacang siswa :

Kami sekarang akan mendaftarkan hook shutdown:

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

Saat kita menjalankan metode pengujian, kita bisa melihat metode destruksi () dipanggil.

3.2. Internasionalisasi Dengan MessageSource

The ApplicationContext antarmuka memperluas MessageSource antarmuka, oleh karena itu menyediakan fungsionalitas internasionalisasi.

Sebuah wadah ApplicationContext secara otomatis mencari kacang MessageSource dalam inisialisasi, dan kacang harus dinamai sebagai messageSource .

Berikut adalah contoh penggunaan bahasa yang berbeda dengan MessageSource :

Pertama, mari tambahkan direktori dialog ke classpath dan tambahkan dua file ke direktori dialog: dialog_en.properties dan dialog_zh_CN.properties .

dialog_en.properties :

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

dialog_zh_CN.properties :

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

Konfigurasikan kacang messageSource di classpathxmlapplicationcontext-internationalization.xml :

    dialog/dialog    

Kemudian, mari kita dapatkan kata-kata dialog bahasa yang berbeda 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. Referensi ke ApplicationContext

Terkadang kita perlu mendapatkan referensi ApplicationContext di dalam kacang yang dikelola olehnya, kita dapat menggunakan ApplicationContextAware atau @Autowired untuk melakukan ini. Mari kita lihat cara kerja ApplicationContextAware :

Kami memiliki kelas Kursus dengan nama:

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

Kami memiliki kelas Guru yang menyusun kursusnya sesuai dengan biji wadah:

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 kita konfigurasi kacang kursus dan kacang guru di classpathxmlapplicationcontext-example.xml :

Kemudian - uji injeksi properti 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 mengimplementasikan antarmuka ApplicationContextAware , penggunaan anotasi @Autowired memiliki efek yang sama.

Mari kita ubah kelas Guru menjadi 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 tes itu, kita bisa melihat hasilnya sama.

5. Kesimpulan

ApplicationContext adalah wadah Spring dengan fungsionalitas khusus perusahaan yang lebih banyak dibandingkan dengan BeanFactory , dan ClassPathXmlApplicationContext adalah salah satu implementasi yang paling umum digunakan.

Jadi dalam artikel ini, kami memperkenalkan beberapa aspek ClassPathXmlApplicationContext , termasuk penggunaan dasarnya, fungsionalitas pendaftaran penonaktifan, fungsi internasionalisasi, dan memperoleh referensinya.

Seperti biasa, kode sumber lengkap untuk contoh tersedia di GitHub.