快捷链接!
继续上一章,我们剩下了最重要的一行代码,
上面的代码就是refresh最主要的代码
我们来逐个分析
首先 prepareRefresh()
这个函数的主要作用是为Refresh做准备,包括是否激活标志位,初始化property source的配置等。
内部代码很简单,基本都是一些赋值语句。
继续向下
我们来看obtainFreshBeanFactory()
这个函数返回了一个beanFactory。我们在这里返回BeanFactory的意义,其实是为了下一个函数prepareBeanFactory(beanFactory) 做准备。
首先,beanFactory.setBeanClassLoader(getClassLoader());,设置一个classLoader,在这里不细说。
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
这一行代码是一个Bean的表达式解析器。那么什么是Bean的表达式解析器?
这个问题和Web有关,比如你在JSP页面上写一个 ${beanName.get***} setBeanExpressionResolver这个函数就是用来处理这个东西的。
我们继续往下看,
这个代码可能名字看起来云里雾里的,但是功能其实还是比较好理解
它是将"字符串"转换为一个类,因为其实我们平时传一个类 都是这样一个字符串,这个函数就是吧这个字符串转换成一个class对象。
这个函数就可以顾名思义了,添加一个后置处理器。这个后置处理器叫做ApplicationContextAwarProcessor,这个处理器后面可能会提到。
有的人可能会问,什么是后置处理器? 其实如果单纯的浏览一遍Spring的源码,我们会发觉PostProcess这个东西出现的很对,其实在我看来,Spring中50%以上的工作都是通过一个一个的后置处理器完成的。包括Bean的生命周期!!
这一大堆代码,其实不是很重要,主要是忽略一些借口,使得它不会自动注入。
这一段代码,主要的作用是依赖的替换。举个例子,如果我想为一个类A注入一个BeanFactory,那么Spring会自动的把你要注入的这个BeanFactory替换成单例池里(不一定在单例池里,但是这四种类一定是Spring自动生成好的)已经有的类。
这一段代码,意思是如果自定义的Bean中没有名为"systemProperties"和"systemEnvironment"的Bean,则注册两个Bena,Key为"systemProperties"和"systemEnvironment",Value为Map, 这两个Bean就是一些系统配置和系统环境信息。其实我们基本不会在类里面主动配置systemProperties与systemEnvironment,所以这部分基本上都会被执行。