Rumah  >  Artikel  >  Java  >  Analisis kod sumber musim bunga dalam java

Analisis kod sumber musim bunga dalam java

WBOY
WBOYke hadapan
2023-04-30 23:13:05812semak imbas

Analisis kod sumber

1. Persediaan awal

<code>/**<br> * spring debug<br> * @author huangfu<br> */<br>public class SpringDebug {<br>public static void main(String[] args) {<br>		AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(SpringDebugConfig.class);<br>	}<br>}<br></code>

Saya rasa baris kod di atas telah digunakan. oleh orang yang telah menggunakan Spring Mereka sangat biasa dengannya Jika anda tidak biasa dengannya, maka saya menasihati anda untuk belajar menggunakannya dahulu, dan kemudian menyelidiki logik asas beberapa kod sumber!

Mari kita lihat cara dia membuat instantiat kacang selangkah demi selangkah, mengambil alih kacang, dan kemudian melaksanakan pelbagai kelas kitaran hayat! Mari kita membuat tekaan dahulu. Apabila musim bunga membaca kacang ini, maklumat tentang kacang mesti disimpan pada entiti tertentu. Kelas ini adalah BeanDefinition Jadi apa yang disimpannya? Mari lihat subkelasnya AbstractBeanDefinition

Analisis kod sumber musim bunga dalam java yang mentakrifkan nilai atribut yang serupa dengan ini Sudah tentu, pengarang telah memintas beberapa atribut, dan atribut di dalamnya jauh lebih daripada Ini adalah lebih banyak lagi. Tujuannya ialah apabila biji dibuat instantiated, data yang diperlukan tidak perlu diperoleh melalui refleksi sendiri, sebaliknya, ia dibaca semua semasa permulaan Spring Anda hanya boleh mengambilnya dari sini Selepas konsep, adakah kita keliru? Di manakah ia menyimpannya selepas membacanya? Jawapannya adalah untuk menyimpannya di beanFactory, jadi Spring pasti akan melaksanakan kilang kacang terlebih dahulu apabila memulakan! Memasuki
, anda akan mendapati ia belum dimulakan di mana untuk memulakannya? Seperti yang kita semua tahu, apabila kelas dimulakan semula, pembina kelas induk akan dimuatkan dahulu, jadi kita perlu melihat kelas induknya

:AnnotationConfigApplicationContextGenericApplicationContext

Seperti yang dijangkakan , ia adalah kilang kacang kelas induk A yang dicipta dalam kelas Dengan kilang itu kini tersedia, kami terus kembali ke
<code>public GenericApplicationContext() {<br>    //初始化bean的工厂<br>    this.beanFactory = new DefaultListableBeanFactory();<br>}</code>     
dan melihat ke bawah: kami mendapati ia memanggil ini(), menunjukkan bahawa ia memanggilnya sendiri. pembina kosong, jadi mari kita masuk dan lihat:

AnnotationConfigApplicationContext

<code>public AnnotationConfigApplicationContext() {<br>    //初始化读取器<br>    this.reader = new AnnotatedBeanDefinitionReader(this);<br>    //初始化扫描器<br>    this.scanner = new ClassPathBeanDefinitionScanner(this);<br>}</code>   
"Pada ketika ini kita dapat melihat gambar di atas: kilang kacang ada semasa pemula"

🎜> "Kemudian mulakan pembaca dalam kaedah pembinaan kosong anda sendiri
Analisis kod sumber musim bunga dalam java

                                                                                                                                      🎜>Langkah seterusnya ialah memanggil

kaedah. Apa yang perlu dilakukan? Bayangkan, kadangkala konfigurasi pengimbasan automatik kami dikonfigurasikan melalui anotasi
Di manakah kelas ini biasanya terletak? By the way, ia biasanya dalam kelas konfigurasi! Analisis kod sumber musim bunga dalam java

Untuk mengetahui bahawa kita ingin mengimbas kelas di bawah pakej tersebut, kita mesti menghuraikan AnnotationConfigApplicationContext kelas konfigurasi dahulu, supaya kita boleh mendapatkan pakej yang ingin kita huraikan kemudian. Sudah tentu, kaedah ini bukan sahaja menghuraikan pakej yang diimbas dan perkara lain telah dihuraikan, yang saya tidak akan terangkan dalam artikel ini!

<code>   /**<br>	 * 创建一个新的AnnotationConfigApplicationContext,从给定的带注释的类派生bean定义<br>	 * 并自动刷新上下文。<br>	 * @param annotatedClasses one or more annotated classes,<br>	 * e.g. {@link Configuration @Configuration} classes<br>	 */<br>public AnnotationConfigApplicationContext(Class>... annotatedClasses) {<br>//读取Spring内置的几个的class文件转换为bd  然后初始化bean工厂<br>this();<br>//这一步就是将配置类Config进行了注册并解析bd<br>		register(annotatedClasses);<br>//这一步是核心,Spring的理解全在这一步,这一步理解了也就可以说将Spring理解了70%<br>//内部做一系列的操作如调用bean工厂的后置处理器   实例化类  调用 后置处理器的前置处理   初始化类  调用后置处理器的后置处理 注册事件监听等操作<br>//完成一个类从class文件变为bean的生命周期<br>		refresh();<br>	}</code>     
2. Fungsi teras

registerBaiklah, jika kita turun lebih jauh, kita akan tahu bahawa kita akan mengimbas kelas di bawah pakej tersebut dan mengubahnya menjadi kacang, jadi mari kita teruskan ke bawah, Apabila kita sampai ke @ComponentScan("com.service"), kaedah ini adalah kaedah teras bagi keseluruhan pemula Springbean. Jika anda memahaminya, anda akan dapat memahami instantiasi Spring, panggilan balik dan isu lain :

<code>@Configuration<br>@ComponentScan("com.service")<br>public class SpringDebugConfig {}</code>     
Selepas masuk , kami menganalisis fungsi yang dilakukan kaedah mengikut kaedah, pertama sekali:

BeanDefinition1 prepareRefresh();

Berikut adalah satu siri tugasan sebelum menyegarkan kilang kacang Operasi terutamanya kerana banyak atribut kilang Spring yang dibuat sebelum ini adalah kosong Kaedah ini adalah untuk melaksanakan satu siri operasi nilai permulaan untuknya >

refresh();Beritahu subkelas untuk menyegarkan semula kilang kacang dalaman kilang kacang baru akan diwujudkan. Kilang baharu dan kembali

❞                                                                                            …❞ PostprocessBeanFactory (BeanFactory); Ini bermakna bahawa pembangun Spring mahu pemanggil menggunakannya apabila menyesuaikan sambungan! ❞                                                                                                                                                                                                       PostProcessors (beanFactory) bd didaftarkan di kilang Selepas imbasan selesai, semua
mula dilaksanakan di sini apabila menyesuaikan
, masa panggil baliknya ialah apabila Spring dibaca semua
Selepas memanggilnya, pembaca boleh mencari kaedah penggunaan tertentu sendiri!

❞                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     ‘ 🎜> antara muka? Ia didaftarkan ke dalam kilang Spring dalam kaedah ini Sudah tentu, sila ambil perhatian bahawa ia hanya didaftarkan dan tidak dilaksanakan! Mengingat tidak dilaksanakan!

❞                                                                                                                                          initSumber                      init                                 Tujuannya adalah untuk melakukan operasi antarabangsa, iaitu, permulaan sumber i18n
❞                                                                                                                                                                                                                                                                                                                                                      initApplicationEventMulticaster();
(terbitkan acara),
(pemantauan acara),
(maklumat acara khusus Tujuan kaedah ini adalah untuk memulakan acara.

❞                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ! BeanFactoryPostProcessors❞                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ;      Apa yang kami panggil instantiasi kacang, suntikan, menyelesaikan kebergantungan bulat, panggil balik BeanFactoryPostProcessors dan operasi lain semuanya dilaksanakan di sini! BeanDefinition

12 SELESAI ();
Langkah terakhir: Lepaskan acara yang sepadan. Acara terbina dalam musim bunga

beanPostProcessor

Atas ialah kandungan terperinci Analisis kod sumber musim bunga dalam java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam