Inversionofcontrol (disingkat IOC)
Sederhananya, ketika Anda membutuhkan objek, Anda tidak perlu secara manual baru, tetapi wadah lain akan memberi Anda; Musim semi adalah wadah IOC.
Misalnya:
Di musim semi, Anda sering perlu merakit DAO dalam layanan, dan umumnya menggunakan anotasi @Autowired: Mirip dengan yang berikut ini
Layanan Public ClassImpl {@Autowired dao dao; public void getData () {dao.getData (); }Jika Anda menggunakan DAO secara langsung tanpa inisialisasi, pengecualian pointer nol akan dilaporkan. Metode di musim semi adalah memuat kelas yang diperlukan untuk Anda melalui refleksi.
Berikut adalah contoh yang mensimulasikan di dan IOC Spring
Pertama tulis dua anotasi untuk mensimulasikan musim semi:
Anotasi entitas mewakili @service @target (elementType.type) dari spring // class @retention (retentionpolicy.runtime) public @interface Entity {} mewakili @autowrid @target (elementType.field) dari Spring // @retention (retentionPolicy.runtime) dari metode / / / hanya public @intence @intence (retentionpolicy.runtume) dari metode / / / hanya public @intera @intence {retention {{retentie.runtime) dari Metode // Hanya Public @Inder @Inter @Inder (InterCeCe (RetentionPolicy. Setelah anotasi ditetapkan, dua kelas dibuat:
Kelas hujan mewakili kebutuhan untuk mendapatkan data cuaca (database atau server) dari tempat lain.
Public Class Rain {public void rain () {System.out.println ("Raining"); // saya menulisnya secara langsung untuk kenyamanan}}Kelas cuaca mewakili data cuaca yang diperoleh
@EntityPublic Class Weather {@resources Rain Rain; // inilah hujan public void weather_rain () {rain.rain (); }Berikut ini adalah injeksi langsung melalui refleksi:
Pertama, iterate melalui nama paket yang ditentukan: Langkah ini dihilangkan terlebih dahulu.
Pertama, buat daftar untuk mensimulasikan kontainer kacang musim semi, dan kemudian semua kelas yang diinisialisasi dengan anotasi entitas akan diinisialisasi.
Public Class Weather_reflect {Daftar <Pap Object> ObjectList; // Simulasikan Container Musim Semi Weather_reflect () {ObjectList = New ArrayList <POMPERTS> ();} // Faktanya, cara terbaik di sini adalah menemukan kelas yang lebih baik, menilai objek entitas dan kemudian meneruskannya. get_ref (objek objek) melempar ClassNotFoundException, IllegalAccessException, InstantiationException, NosuchMethodeException, InvocationTargetException {class <?> clazz = objek.getClass (); if (clazz.isannotationPresent (entity.class) {//if owannotationpresent (enttity.class) {); if (clazze.isannotationpresent (entity.class) {) = clazz.getDeclaredFields (); // Dapatkan variabelnya untuk (bidang bidang: bidang) {if (field.isannotationPresent (sumber daya.class)) {// menilai apakah kelas <?> RainClass = class.forname (field. field.set (Object, RainClass.NewInstance ()); // Tetapkan ke RainObjectList.Add (objek); // Akhirnya simpan cuaca yang ditetapkan ke dalam wadah}}}}} Daftar Publik <T objek> returnList () {return ObjectList; // Return container untuk penggunaan di masa mendatang}Akhirnya, itu untuk mensimulasikan penggunaan pengontrol secara langsung
public class WeatherPrediction {public static void main(String args[]) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {WeatherPrediction weatherPrediction =new WeatherPrediction();Weather weather =(Weather)weatherPrediction.springDo();weather.weather_rain();// If it is Panggilan normal, pengecualian penunjuk nol akan dilaporkan, dan wadah memberikan variabel hujan ke sana, sehingga dapat menghasilkan biasanya}/* mensimulasikan proses startup pegas. Bahkan, Anda dapat menulis kelas secara terpisah. This step is what the container should do, and we don't need to worry about it*/public Object springDo() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Weather_reflect weather_reflect =new Weather_reflect();// Weather weather =new when it starts Weather();//Scan the class annotation dan kemudian lanjutkan ke langkah selanjutnya weather_reflect.get_ref (cuaca); // Operasi baru variabel di kelasnya dan masukkan ke dalam objek objek wadah = weather_reflect.returnlist (). Get (0); return objek;} buka output: hujan turun ().Tidak ada operasi baru pada hujan di Weatherprediction, tetapi dapat digunakan. Ini harus menjadi contoh IOC paling sederhana untuk mensimulasikan musim semi. Tentu saja, wadah IOC Spring jauh lebih kuat dari ini, seperti keamanan utas perlu dipertimbangkan, dan berbagai detail diperlukan.
Meringkaskan
Di atas adalah semua penjelasan terperinci dari artikel ini tentang implementasi sederhana dari prinsip IOC Spring, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke situs ini:
Penjelasan terperinci tentang prinsip IOC musim semi
Pemahaman singkat tentang contoh IOC, AOP, dan kode musim semi
Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!