Kata pengantar
Artikel ini terutama memperkenalkan konten yang relevan tentang pemuatan konteks saat pegas dimulai. Ini dibagikan untuk referensi dan pembelajaran Anda. Saya tidak akan mengatakan banyak hal di bawah ini, mari kita lihat perkenalan terperinci bersama.
Kode Sumber Uji Unduh Test-Annotation.zip
Ada kode berikut
@ComponentPublic kelas HelloWorldService {@Value ("$ {name: world}") private string name; Public String getHellomessage () {return "hello" + this.name; }} @Configurationpublic class bootstrap {@bean public static helloWorldService helloService () {return new HelloWorldService (); } public static void main (String [] args) {Instantiationstrategy Instantiationstrategy = new SimpleIntiationstrategy (); DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory (); beanfactory.setInstantiationstrategy (Instantiationstrategy); AnnotationConfigApplicationContext ApplicationContext = new AnnotationConfigApplicationContext (BeanFactory); ApplicationContext.Register (bootstrap.class); applicationContext.refresh (); HelloWorldService Service = ApplicationContext.getBean (HelloWorldService.class); System.out.println (service.getHellomessage ()); applicationContext.close (); }} HelloWorldService.getHelloMessage Metode hanya mengembalikan nilai nama. Metode BootStrap.main menggunakan annotationconfigapplicationContext untuk membuat objek konteks. Untuk kenyamanan demonstrasi, deklarasi yang ditampilkan dari instance DefaultListableBeanFactory dan Instantiationstrategy. Dapatkan referensi kacang melalui applicationContext.getBean () dan hubungi metode service.getHelloMessage() .
Pemuatan konteks terutama terjadi dalam metode applicationContext.register dan metode applicationContext.refresh .
Tujuan dari ApplicationContext.Register Metode adalah untuk menghasilkan objek beandefinition untuk parameter (kelas dijelaskan menggunakan @configuration) dan hubungi DefaultListableBeanFactory.registerBeanDefinition untuk mendaftarkan peminat beand ke dalam defaultListableAnfactory.
Fungsi applicationContext.refresh() lebih. Fungsi utama adalah memanggil postprocessor untuk menghasilkan objek beandefinition yang sesuai untuk metode anotasi @Bean di kelas @configuration dan mendaftarkannya di DefaultListableBeanFactory. Fungsi kedua adalah untuk melintasi definisi beand di defaultListableBeanFactory untuk menghasilkan objek nyata.
Proses terperinci untuk menghasilkan objek beandefinition untuk metode anotasi @Bean di kelas @configuration adalah sebagai berikut
Langkah 1. Temukan prosesor beandefinitionregistrypostprocessor yang sesuai
org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors() { ... //Get the applicable BeanDefinitionRegistryPostProcessor bean name String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); ... // GetPostProcessor Berdasarkan Beanname, The Beanname of the @Configuration Annotation Class adalah //org.springframework.context.annotation.InternalConfigurationAnnotationProcessor // diimplementasikan sebagai org.springframework.context.annotation.configuration = beanfactory.getbean (postprocessornames [0], beandefinitionregistrypostprocessor.class)} Langkah 2: Hasilkan Objek ConfigurationClass untuk @configuration
// Gunakan ConfigurationClassParser untuk menguraikan kelas yang dijelaskan oleh @configuration,
// Setiap kelas anotasi @Configuration menghasilkan objek ConfigurationClass.
// ConfigurationClass.getBeanMethods() dapat memperoleh semua metode di kelas ini yang menggunakan anotasi @Bean.
// Metode anotasi @Bean diwakili oleh objek beanmethod
org.springframework.context.annotation.configurationclasspostprocessor.processConfigBeandefinitions (beandefinitionregistry registry) {configurationclassparser parser = thisprooader, thisprooader (this.metadateaderfactory, this. Ini. parser.parse (configCandidates); parser.validate (); this.reader.loadBeandefinitions (parser.getConfigurationclasses ());}Langkah 3. Metode anotasi @Bean menghasilkan beandefinition dan menyuntikkannya ke dalam DefaultListableBeanFactory
org.springframework.context.annotation.configurationclassbeandefinitionReader.LoadBeandefinitionSforBeanMethod (beanMethod beanMethod) {configurationclassbeandfinition beanDef = new configurationclassbeanDefinition (configuration); beandef.setBeanClassName (configClass.getMetadata (). getClassName ()); beandef.setFactoryMethodname (metadata.getMethodname ()); // Registry adalah contoh dari defaultListableBeanFactory this.registry.registerbeandefinition (beanname, beandeftoregister);}Hubungi tumpukan untuk prosedur ini:
Menghasilkan tumpukan panggilan dari prosedur instance menurut beandefinition:
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.