10
this.refreshContext(context); //刷新应用上下文
我们点进去看下具体执行了哪些操作:
this.prepareRefresh();
这个方法主要作用是为刷新容器做些准备工作。点进去看:
这里记录了启动的时间,设置了关闭标识和活跃标识。this.initPropertySources();
这个操作是调用子类重写的方法,进行一些属性的初始化。this.getEnvironment().validateRequiredProperties();
这一步是验证必须属性是否填写正确。
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
这步主要操作:将现有的beanFactory干掉,然后获取一个新的beanFactory。如下图代码所示(至于为什么要这样操作,我还没有搞清楚):
this.prepareBeanFactory(beanFactory);
这个方法主要是对beanFactory进行一些配置,我们点进去看下:
beanFactory.setBeanClassLoader(this.getClassLoader());
这是设置类加载器,如果加载器存在,则使用当前加载器,不存在就新加一个。
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
设置BeanExpressionResolver表达式解析器,主要用来解析EL表达式;Bean初始化完成后填充属性时会用到
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, this.getEnvironment()));
设置属性注册解析器PropertyEditor;这个主要是对某些注入的Bean的一些属性的支持;
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
ApplicationContextAwareProcessor,它是用来处理并回调实现了各种Aware接口的Bean,比如获取ApplicationContext的ApplicationContextAware接口。
beanFactory.ignoreDependencyInterface();
忽略指定接口,该接口不会被注入。
beanFactory.registerResolvableDependency();
设置自动装配规则。
上文引用了博文<SpringBoot深入学习(一)-- refresh()>,这位大佬解释的很详细透彻,大家也可以直接去这篇博客了解该方法。
this.postProcessBeanFactory(beanFactory);
这个方法点进去看下:
主要分三部分,前三个方法就是往bean工厂里添加ServletContextAwareProcessor处理器,这个处理器可以拿到ServletContext和ServletConfig的引用,所以后面就忽略了ServletContext和ServletConfig的依赖。
WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);
是注册web应用的scopes,下面的方法是注册和环境有关的beans。
this.invokeBeanFactoryPostProcessors(beanFactory);
这个方法主要作用是在上下文中调用注册为bean的工厂处理器(源码及其庞大,想要具体了解的可以自行了解,这里就不展开了)。
this.registerBeanPostProcessors(beanFactory);