Предисловие
Эта статья в основном представляет соответствующий контент о загрузке контекста, когда начинается пружина. Это обменивается вашей ссылкой и обучением. Я не скажу многое ниже, давайте посмотрим на подробное введение вместе.
Испытательный исходный код скачать test-annotation.zip
Есть следующий код
@Componentpublic class 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 SimpleInstantiationStrategy (); Default -stistablebeanfactory beanfactory = new Default -letristbeanfactory (); 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 просто возвращает значение имени. Метод BootStrap.main использует AnnotationConfigApplicationContext для построения контекстного объекта. Для удобства демонстрации отображаемые объявления об экземплярах DefaultBeanbeanfactory и InstantiationStrategy. Получите ссылку на Bean через ApplicationContext.getBean () и вызовите метод service.getHelloMessage() .
Загрузка контекста в основном происходит в методе applicationContext.register и методе applicationContext.refresh .
Цель метода ApplicationContext DefaultListableBeanFactory.registerBeanDefinition
Функция applicationContext.refresh() больше. Основная функция состоит в том, чтобы вызвать постпроцессор, чтобы сгенерировать соответствующий объект Beandefinition для метода аннотации @Bean в классе @Configuration и зарегистрировать его в default -listablebeanfactory. Вторая функция состоит в том, чтобы пересечь боиндефинирование в списке по умолчанию, чтобы сгенерировать реальный объект.
Подробный процесс генерации объекта Beaindefinition для метода аннотации @Bean в классе @Configuration выглядит следующим образом
Шаг 1. Найдите соответствующий процессор BeAndefinitionRegistryPostProcessor
org.springframework.context.support.postprocessorgeRegistrationDelegate.invokebeanFactoryPostProcessors () {... // Получить применимый BeAndefinitionRegistryPostProcessor bean name [] postprocessornames = beanfactory.getbeannamesfortype (BeandefintionRegescorsorscoressorscoressorscoressorscoressorsossorsorscoressorsossorsossorsorsoscoressorsorsossorsorsostroscoressor. ... //GetPostProcessor based on beanName, The beanName of the @Configuration annotation class is //org.springframework.context.annotation.internalConfigurationAnnotationProcessor //Implemented as org.springframework.context.annotation.ConfigurationClassPostProcessor ConfigurationClassPostProcessor postProcessor = beanfactory.getbean (postprocessornames [0], Beandefinitionregistrypostprocessor.class)} Шаг 2: Сгенерировать объект ConfigurationClass для @Configuration
// Использовать ConfigurationLASSPASSER для анализа класса, аннотированного @Configuration,
// каждый класс Annotated @Configuration генерирует объект ConfigurationClass.
// ConfigurationClass.getBeanMethods() может получить все методы в этом классе, которые используют аннотацию @Bean.
// метод аннотации @Bean представлен объектом BeanMethod
org.springframework.context.annotation.configurationclasspostprocessor.processconfigbeandefinitions (реестр BeandefinitionRegistry) {ConfigurationClassParser parser = new ConfigurationClassParser (это. MetaDatareaderActory, это. это. parser.parse (configcandidates); parser.validate (); this.reader.loadbeandefinitions (parser.getConfigurationClasses ());}Шаг 3. Метод аннотации @Bean генерирует боиндефинирование и внедряет его в по умолчанию спискоблефактор
org.springframework.context.annotation.configurationclassbeandefinitionReader.LoadBeanDefinitionSforbeanMethod (Beanmethod Beanmethod) {ConfigurationLASSBANSBEANDEFINITION BEANDEF = новый ConfigurationClassBeanDefinition (configclass); beandef.setbeanclassname (configclass.getmetadata (). getClassName ()); beandef.setfactorymethodname (metadata.getmethodname ()); // реестр является экземпляром default -stistablebeanfactory this.registry.registerbeandefinition (Beanname, Beandeftoregister);}Звоните в стек для этой процедуры:
Создайте стек вызовов процедуры экземпляра в соответствии с Beandefinition:
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.