머리말
이 기사는 주로 스프링이 시작될 때 컨텍스트로드에 대한 관련 내용을 소개합니다. 참조와 학습을 위해 공유됩니다. 아래에서 많이 말하지 않겠습니다. 자세한 소개를 함께 살펴 보겠습니다.
테스트 소스 코드 다운로드 Test-Annotation.zip
다음 코드가 있습니다
@ComponentPublic Class HelloWorlDservice {@Value ( "$ {name : world}") 개인 문자열 이름; 공개 문자열 gethellomessage () {return "hello" + this.name; }} @configurationPublic 클래스 부트 스트랩 {@bean public static helloworldservice helloService () {return new HelloWorldService (); } public static void main (string [] args) {InstantiationStrategy InstantiationStrategy = 새로운 SimpleInstantationTrategy (); defaultListableBeanFactory BeanFactory = New DefaultListableBeanFactory (); beanfactory.setinstantiationtstrategy (Instantiationstrategy); AnnotationConfigApplicationContext ApplicationContext = new AnnotationConfigApplicationContext (BeanFactory); ApplicationContext.register (bootstrap.class); ApplicationContext.refresh (); helloworldservice service = ApplicationContext.getBean (helloorldservice.class); System.out.println (service.gethellomessage ()); ApplicationContext.close (); }} HelloWorldService.getHelloMessage 메소드는 단순히 이름 값을 반환합니다. BootStrap.main 메소드는 AnnotationConfigApplicationContext를 사용하여 컨텍스트 객체를 구성합니다. 데모의 편의를 위해, 표시된 기본리스트리스트 가능한 비안 요소 및 인스턴스테이션 스트레이트 화 인스턴스의 표시된 선언. ApplicationContext.getBean ()을 통해 Bean 참조를 가져 와서 service.getHelloMessage() 메소드를 호출하십시오.
컨텍스트의로드는 주로 applicationContext.register 메소드 및 applicationContext.refresh 메소드에서 발생합니다.
ApplicationContext.register 메소드의 목적은 매개 변수에 대한 beandefinition 객체를 생성하는 것입니다 (@Configuration을 사용하여 주석이 달린 클래스). DefaultListableBeanFactory.registerBeanDefinition 호출하여 defaultListableBeanFactory에 BeanDefinition을 등록하는 것입니다.
applicationContext.refresh() 의 기능이 더 많습니다. 주요 기능은 @Configuration 클래스에서 @Bean 주석 메소드에 해당하는 BeanDefinition 객체를 생성하여 DefaultListableBeanFactory에 등록하는 것입니다. 두 번째 함수는 DefaultListableBeanFactory에서 BeanDefinition을 통과하여 실제 객체를 생성하는 것입니다.
@Configuration 클래스에서 @Bean 주석 메소드에 대한 BeanDefinition 객체를 생성하는 상세한 프로세스는 다음과 같습니다.
1 단계. 적절한 beandefinitionregistrypostprocessor 프로세서를 찾으십시오
org.springframework.context.support.postprocessorregistrationdelegate.invokebeanfactorypostprocessors () {... // 적용 가능한 beandefinitionregistrypostprocessor bean name string [] postprocessornames = beanforforty.getbeannamestype (beandefinitiongreptoryposcessor); ... // getPostProcessor beanname을 기반으로 @configuration 주석 클래스의 beanname은 //org.spramext.annotation.internalConfigurationAnnotationProcessor // org.springframework.context.annoT.ConfigurationCessor Conspigerationsor Configerationsprocessor as as as as as as a @configuration annotation class. = beanfactory.getBean (postprocessornames [0], beandefinitionregistrypostprocessor.class)} 2 단계 : @Configuration의 구성 클래스 개체를 생성합니다
// configurationClassParser를 사용하여 @Configuration으로 주석을 달고있는 클래스를 구문 분석합니다.
// 각 @Configuration 주석화 된 클래스는 configurationclass 객체를 생성합니다.
// ConfigurationClass.getBeanMethods() @bean 주석을 사용하는이 클래스의 모든 메소드를 얻을 수 있습니다.
// @Bean 주석 메소드는 BeanMethod 객체로 표시됩니다.
org.springframework.context.annotation.configurationClassPostProcessor.processConfigBeanDefinitions (beanDefinitionRegistry Registry) {configurationClassParser Parser = 새로운 configurationClassParser (this.MetAdaReaderFactory, this.problemreporter, this. this.componentscanbeannamegenerator, 레지스트리); parser.parse (configcandidates); parser.validate (); this.reader.loadBeanDefinitions (parser.getConfigurationClasses ());}3 단계. @bean 주석 메소드는 beandefinition을 생성하여 defaultListableBeanFactory에 주입합니다.
org.springframework.context.annotation.configurationClassBeanDefinitionReader.loadBeanDefinitionSforBeanMethod (BeanMethod BeanMethod) {configurationClassBeendeFinitef = new ConfigurationClassBeanDefinition (configclass); beandef.setBeanClassName (configClass.getMetadata (). getClassName ()); beandef.setFactoryMethodName (metadata.getMethodName ()); // 레지스트리는 defaultListableBeanFactory this.registry.registerBeanDefinition (BeanName, BeanDeftoreGister)의 인스턴스입니다.이 절차에 대한 통화 스택 :
BeanDefinition에 따라 인스턴스 절차의 통화 스택을 생성하십시오.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.