Spring IOC容器的创建过程源码分析
作者:bin- 1.prepareRefresh()
- 2.obtainFreshBeanFactory()
- 3.prepareBeanFactory()
- 4.postProcessBeanFactory()
- 5.invokeBeanFactoryPostProcessors()
- 6.registerBeanPostProcessors()
- 7.initMessageSource()
- 8.initApplicationEventMulticaster()
- 9.onRefresh()
- 10.registerListeners()
- 11.finishBeanFactoryInitialization()
- 12.finishRefresh()
Spring容器的创建过程、Bean的创建过程,主要在refresh函数中完成,通常我们使用下面的方法去创建、以及初始化容器:
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Config.class); annotationConfigApplicationContext.refresh(); //最终调用到AbstractApplicationContext.refresh()
在Spring Boot中,提供了run方法
SpringApplication.run(SpringBin.class, args); //最终调用到AbstractApplicationContext.refresh()
AbstractApplicationContext.refresh()代码如下:
public void refresh(){ synchronized (this.startupShutdownMonitor) { // 1.准备初始化beanFactory的准备工作 prepareRefresh(); // 2.告诉子类刷新内部bean工厂 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 3.beanFactory的预准备工作 prepareBeanFactory(beanFactory); try { //4.在beanFactory创建,并预准备完成后,允许子类执行一些postProcess postProcessBeanFactory(beanFactory); // 5.执行beanFactory的PostProcessor, invokeBeanFactoryPostProcessors(beanFactory); // 6.注册beanPostProcessor registerBeanPostProcessors(beanFactory); // 7.做国际化,消息绑定,消息解析 initMessageSource(); // 8.初始化事件派发器 initApplicationEventMulticaster(); // 9.留给子类,在容器刷新时,可以重写这个方法自定义逻辑 onRefresh(); // 10.将时间监听器,添加到事件派发器中,并且将早起事件先派发 registerListeners(); // 11.初始化所有剩下的单实例bean finishBeanFactoryInitialization(beanFactory); // 12.完成容器创建,派发创建事件等 finishRefresh(); ....
然后我们逐个来看每个方法都做了什么
1.prepareRefresh()
prepareRefresh主要完成,初始化beanFactory的准备工作
protected void prepareRefresh() { ... // 初始化属性配置,主要给继承AbstractApplicationContext的子类实现 initPropertySources(); // 验证属性合法性 getEnvironment().validateRequiredProperties(); //保存早期事件 this.earlyApplicationEvents = new LinkedHashSet<>();
2.obtainFreshBeanFactory()
刷新bean工厂的实例,其中2个都是抽象方法,由子类来做具体实现
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { //调用到GenericApplicationContext.refreshBeanFactory() refreshBeanFactory(); //调用到GenericApplicationContext.refreshBeanFactory() return getBeanFactory(); }
GenericApplicationContext类部分内容如下
//默认工厂在类初始化就创建好了 public GenericApplicationContext() { this.beanFactory = new DefaultListableBeanFactory(); } .... //在刷新工厂时,只是设置了一个唯一id @Override protected final void refreshBeanFactory() throws IllegalStateException { .... this.beanFactory.setSerializationId(getId()); } .... //直接将beanFacotry返回 @Override public final ConfigurableListableBeanFactory getBeanFactory() { return this.beanFactory; }
3.prepareBeanFactory()
在上一步中,beanFactory只是一个默认的工厂,什么都是空的,在这一步中,对beanFactory进行准备工作,设置一些属性
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { //设置类加载器 beanFactory.setBeanClassLoader(getClassLoader()); .... //添加bean部分BeanPostProcessor beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); //设置忽略的自动装配的接口,基础类这些接口的,不能自动注入到工厂中 beanFactory.ignoreDependencyInterface(EnvironmentAware.class); .... //在bean属性的注入时,如果根据第一个参数指定类型注入,就直接注入第二个参数的对象 beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); beanFactory.registerResolvableDependency(ApplicationContext.class, this); .... //添加bean部分BeanPostProcessor beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this)); // 添加编译时,对aspectJ支持 if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { .... } // 向单例容器中注册一些基础对组件 // 注册类3个:ENVIRONMENT_BEAN_NAME、SYSTEM_PROPERTIES_BEAN_NAME、SYSTEM_ENVIRONMENT_BEAN_NAME if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment()); } if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties()); } if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment()); } }
4.postProcessBeanFactory()
在beanFactory创建,并预准备完成后,允许子类执行一些postProcess
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { //do nothing }
5.invokeBeanFactoryPostProcessors()
在这步之前,beanFactory的创建以及预准备工作已经做完了,接下来按排序执行实现BeanDefinitionRegistryPostProcessor接口的postProcess,再排序执行其他beanFactoryProcessor
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); .... public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List beanFactoryPostProcessors) { .... //找到实现BeanDefinitionRegistryPostProcessor接口的postProcess, //并且根据PriorityOrdered.class和Ordered.class排序 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); //执行这些postProcessor invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); .... //同理,并且根据PriorityOrdered.class和Ordered.class排序,执行其他的beanFactoryProcessor String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false); invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
6.registerBeanPostProcessors()
注册beanPostProcessor(bean的后置处理器,拦截bean的创建过程),根据优先级排序,注册beanPostProcessor
public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { //获取所有的beanPostPocessor String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); .... //注册实现PriorityOrdered.class的BeanPostProcessor registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); .... //注册实现Ordered.class的BeanPostProcessor registerBeanPostProcessors(beanFactory, orderedPostProcessors); .... //注册没实现排序的BeanPostProcessor registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); .... //最后注册实现MergedBeanDefinitionPostProcessor接口的BeanPostProcessor //对@Autowired和@Value的支持 registerBeanPostProcessors(beanFactory, internalPostProcessors); .... }
7.initMessageSource()
做国际化,消息绑定,消息解析
protected void initMessageSource() { ConfigurableListableBeanFactory beanFactory = getBeanFactory(); //如果有messageSource就直接赋值 if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) { this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class); .... } else { // 如果没有,就自己创建一个默认的 //一般可以用于取出国际化配置文件中的某个值,能按区域取 DelegatingMessageSource dms = new DelegatingMessageSource(); dms.setParentMessageSource(getInternalParentMessageSource()); this.messageSource = dms; } }
8.initApplicationEventMulticaster()
注册时间派发器,如果bean工厂中有就直接使用,如果没有就注册一个默认的
protected void initApplicationEventMulticaster() { ConfigurableListableBeanFactory beanFactory = getBeanFactory(); //如果容器中有,就使用容器中的事件派发器 if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) { this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class); .... } else { //如果没有配置,就使用一个默认的事件派发器 this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory); beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster); .... } }
9.onRefresh()
留给子类,在容器刷新时,可以重写这个方法自定义逻辑
protected void onRefresh() throws BeansException { // For subclasses: do nothing by default. }
10.registerListeners()
注册时间监听器,并且派发早期事件
protected void registerListeners() { //bean工厂中获取实现来ApplicationListener.class到监听器 String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false); for (String listenerBeanName : listenerBeanNames) { getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName); } // 派发早期事件 Set earlyEventsToProcess = this.earlyApplicationEvents; this.earlyApplicationEvents = null; if (earlyEventsToProcess != null) { for (ApplicationEvent earlyEvent : earlyEventsToProcess) { getApplicationEventMulticaster().multicastEvent(earlyEvent); } } }
11.finishBeanFactoryInitialization()
执行到这一步,bean工厂的初始化工作就已经完全结束了,剩下就初始化所有剩下的单实例bean
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { .... beanFactory.preInstantiateSingletons();
跳过不重要的信息,直接看preInstantiateSingletons方法,
其中getBean的执行过程,可以参考篇文章:Spring geBean()方法执行过程
@Override public void preInstantiateSingletons() throws BeansException { //拿到所有的beanDefinitionNames(bean定义信息) List beanNames = new ArrayList<>(this.beanDefinitionNames); //全部bean都尝试加载 for (String beanName : beanNames) { RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); //确定是否需要加载 if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { if (isFactoryBean(beanName)) { //工厂bean加载方式 Object bean = getBean(FACTORY_BEAN_PREFIX + beanName); .... } else { //普通bean加载方式 getBean(beanName); } } } // 所有的bean都实例化完成后, //查看所有的bean是否实现SmartInitializingSingleton接口 //执行afterSingletonsInstantiated()发放 smartSingleton.afterSingletonsInstantiated(); ....
12.finishRefresh()
完成容器创建后的派发创建事件等
protected void finishRefresh() { //清除上下文级别的资源缓存(例如来自扫描的ASM元数据)。 clearResourceCaches(); // 初始化生命周期处理器,可以通过实现LifecycleProcessor.class // 接口,来接收容器的刷新、和关闭回调 initLifecycleProcessor(); // 调用生命周期处理器的刷新回调 getLifecycleProcessor().onRefresh(); // 发布容器刷新完成的事件 publishEvent(new ContextRefreshedEvent(this)); // 暴露一些MBean相关的东西(大多数时候这个步骤并不关心) LiveBeansView.registerApplicationContext(this); }