<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
:AnnotationConfigApplicationContext
GenericApplicationContext
<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
🎜>Langkah seterusnya ialah memanggil
kaedah. Apa yang perlu dilakukan? Bayangkan, kadangkala konfigurasi pengimbasan automatik kami dikonfigurasikan melalui anotasiUntuk 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
register
Baiklah, 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:
BeanDefinition
1 prepareRefresh();
❝ refresh();
Beritahu subkelas untuk menyegarkan semula kilang kacang dalaman kilang kacang baru akan diwujudkan. Kilang baharu dan kembali
Selepas memanggilnya, pembaca boleh mencari kaedah penggunaan tertentu sendiri!❞ initApplicationEventMulticaster();❞ ‘ 🎜> 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
(maklumat acara khusus Tujuan kaedah ini adalah untuk memulakan acara.12 SELESAI ();❞ !
BeanFactoryPostProcessors
❞ ; Apa yang kami panggil instantiasi kacang, suntikan, menyelesaikan kebergantungan bulat, panggil balikBeanFactoryPostProcessors
dan operasi lain semuanya dilaksanakan di sini!BeanDefinition
❞
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!