从0开始Spring源码(三)

快捷链接! 

从0开始学习Spring源码(一)

从0开始学习Spring源码(二)

从0开始Spring源码(三)

继续上一章,我们剩下了最重要的一行代码,

上面的代码就是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,所以这部分基本上都会被执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值