上一篇: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等