上一篇:Spring5源碼分析-初始化詳細流程 java
容器本身初始化是指Spring容器涉及到的核心類實例化與相關組件的註冊等操做以以下代碼爲例:windows
public class AutowiredAnnotationMain { public static void main(String[] args) { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(); /** * 若是不是一個配置類,能夠直接經過register註冊一個BeanDefinition,而後經過getBean()獲取Bean的時候自動建立Bean */ ac.register(AutowiredAnnotationConfig.class); /** * 若是注入的是一個配置類,那麼須要調用refresh掃描配置類的屬性,作出對應註解的相應動做執行 */ ac.refresh(); AutowiredAnnotationUser user = (AutowiredAnnotationUser)ac.getBean("autowiredAnnotationUser"); System.out.println(user.getDept().getDeptName()); } }
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();就表明了容器自身的初始化源碼分析
裏面主要乾了一下幾個事情:spa
systemProperties:系統相關參數,好比是什麼操做系統,JDK版本號,回車換行符是什麼等等。操作系統
systemEnvironment:系統的環境變量,也就是咋們在windows的環境變量中設置的東西,或者Linux當中profile中設置的東西.net
注:它們此時尚未放到Spring容器中的singletonObjects當中,須要AnnotationConfigApplicationContext.refresh()方法被調用後纔會放到容器當中3d
註冊就是將這些類的BeanDefinition添加到DefaultListableBeanFactory.beanDefinitionMaps當中,代碼:code
//註冊類掃描相關的核心類 if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) { RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class); def.setSource(source); beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)); }
private static BeanDefinitionHolder registerPostProcessor( BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) { definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); registry.registerBeanDefinition(beanName, definition); return new BeanDefinitionHolder(definition, beanName); }
以上步驟初始化步驟執行完以後,觀察幾個核心變量中的值:對象
能夠看到上面說的註冊核心類定義、構造systemProperties systemEnvironment已經完成了,包括實例化DefaultListableBeanFactory也就是ac.beanFactory變量。blog
容器完成自身初始化以後就意味着準備好了接受用戶自定義的配置文件,而且根據配置文件上面的註解進行掃描、分析、生成BeanDefinition,執行自定義的BeanFactoryPostProcessor,實例化Spring Bean(建立裸對象、依賴注入),執行BeanPostProcessor等