spring源码-refresh中的prepareRefresh方法
AnnotationApplicationContext里的refresh方法
分一下模块吧,这里方法确实是有点多了
我们一个一个来看吧

首先做了启动时间的记录,然后将是否关闭和活动状态进行了修改,应该是改成了可更改状态,然后打印日志的我们不关注,直接跳过
到initPropertySource,他其实是一个本类空方法,模板方法模式,可以由子类来实现,并不是必须重写实现
它的描述是在做初始化环境上下文中的占位符,大概可能是这个意思,比如说在bean初始化前将某些属性声明为XXX以占位符的方式进行存储,如果我们重写了这个方法那么就可以对根属性进行修改之类的
下一个方法getEnviroment()他会返回一个ConfigurableEnvironment,然后ConfigurableEnvironment.validateRequiredProperties()

ConfigurableEnvironment.validateRequiredProperties()他会来到ConfigurableEnvironment类的父类ConfigurablePropertyResolver这个方法在这里,然而这是一个接口

它的实现看似有两个,实际上只有一个,都会调用到AbstractPropertyResolver上

那么这个方法到底是在干什么呢,这里就是核心,看命名大概就能知道,这里主要做的就是对设置了required属性的一个遍历,如果注解有必填也就require但是你这里遍历拿不到的话,那么就会抛出异常,但是我们没有使用必填属性的注解,所以这里是通过一个流程而已不会做任何事情,就相当于一个校验罢了
紧着看往下看

我们刚开始初始化,那么是肯定没有所谓的earlyApplicationListeners的,所以创建一个进行赋值,然后再对earlyApplicationEvents进行赋值
创建早期 ApplicationEvents 的集合,以便在 multicaster 可用时发布
那么这个方法主要就是做到几个作用,首先就是可以通过子类复写initPropertySources来达到动态的修改根属性的占位符元素,其次做注解是否遵守required必填属性的一个遍历,最后就是创建一个早期事件发布者和事件监听器,那么到这就是prepareRefresh方法的起到的一个作用

浙公网安备 33010602011771号