随 后 , 便 是 进 行 Spring 应 用 上 下 文 的 后置处理 , 这 一 步 是 通 过postProcessApplicationContext 方法来完成的。
protected void postProcessApplicat ionContext (ConfigurableApplicat ionConEext
context){
f (this. beanNameGenerator != null) {
// 如果 beanNameGenerator 为 null, 则将当前的 beanNameGenerator 按照默认名字进
行注册
context . getBeanFactory(). regi sterSingleton(
Annotat ionConfigUtils .CONF IGURATION BEAN NAME GENERATOR,
this . beanNameGenerator);
esourceLoader 为 null 时, 则根据 context 的类型分别进行 Resourceloader 和 CL
assLoader 的设置
if (this .resourceLoader != null) {
F (context instanceof GenericApplicationContext) {
((GenericApplicationContext) context) . setResourcel oader(this . resource
Loader);
if (context instanceof DefaultResourceLoader) {
( (DefaultResourceLoader) context)
. setClassLoader(this.resourceLoader. getClassLoader());
//如果为 true 则获取并没置转换服务
f (this .addConversionService) {
context . getBeanFactory(). setConversionService(
ApplicationConversionService . getSharedInstance());
}
postProcessApplicationContext 方 法 主 要 完 成 上 下 文 的 后 置 操 作 , 默 认 包 含beanNameGeneratorResourceL oader.ClassL oader 和 ConversionService 的设置。该方法可由子类覆盖实现,以添加更多的操作。
而在此阶段,beanNameGenerator 和 resourceL oader 都为 null,因此只操作了最后-一步的设置转换服务。
最后,在通知监听器 context 准备完成之前,通过 applylnitializers 方法对上下文进行初始化。
所使用的 ApplicationContextInitializer 正是我们在 SpringApplication 初始化阶段设置在itializers 变量中的值,只不过在通过 getlnitializers 方法获取时进行了去重和排序。
protected void applyInitializers(ConfigurableApplicat ionContext context) {
/获取 A 需要zi料+ 绿色徽【vip1024b】
ppl icat ionContextInitializer 集合并遍历
for (ApplicationContextInitializer initializer : getInitializers()) {
//解析当前 initial izer.实现的 Appl icat ionContextInitializer 的泛型参数
Class<?> requiredType = GenericTypeResolver . resolveTypeArgument(
initializer . getClass(), ApplicationContextInitializer.class);
1 断言判断所需类似是否与 context 类型匹配
Assert. isInstanceOf(requiredType, context, "Unable to call initialize
r.");
// 初始化 context
initializer. initialize(context);
}
}
完成以上操作之后,程序便调用 SpringApplicationRunListeners 的 contextPrepared 方法通知监听器,至此第一阶段的准备操作完成。
应用上下文加载阶段
=========
应用上下文加载阶段包含以下步骤:打印日志和 Profile 的设置、设置是否允许覆盖注册、获取全部配置源、将配置源加载入上下文、通知监控器 contex 加载完成。
首先进入应用上下文加载阶段的操作为打印日志和 Profile 的设置,对此不展开讲解。随后,便是获得 ConfigurableL istableBeanFactory 并注册单例对象,注册的单例对象包含:
ApplicationArguments 和 Banner。 当 BeanFactory 为 DefaultL istableBeanFactory 时,进入设置是否允许覆盖注册的处理逻辑。
此处需注意的是,当进行了 ApplicationArguments 类单例对象的注册之后,也就意味着我们在使用 Spring 应用上下文的过程中可以通过依赖注入来使用该对象。
@Resource
private ApplicationArguments applicat ionArguments;
完成以.上操作后,便进入配置源信息的处理阶段,这一步通过 getAllSources 方法来对配置源信息进行合并操作。
public Set getAllSources() {
Set<0bject> allSources = new LinkedHashSet<>();
if (!CollectionUtils.isEmpty(this . primarySources)) {
allSources.addAll(this.primarySources);
if (!CollectionUtils . isEmpty(this. sources)) {
allSources. addAll(this.sources);
}
}
return Collections . unmodifiableSet(allSources); }以上操作逻辑很简单,如果 Set 集合中不存在 primarySources 配置源或 sources 配置源,则将其添加入 Set 中,同时将 Set 设置为不可修改,并返回。
前面章节已经提到,变量 primarySources 的值 来自 SpringApplication 的构造参数,变量sources 的值来自 setResources 方法。
当获得所有的配置源信息之后,通过 load 方法将配置源信息加载到上下文中,代码如下。
protected void load(ApplicationContext context, Object[] sources) {
/日志打印
BeanDefinitionLoader loader = createBeanDefinitionLoader(
getBeanDefinitionRegistry(context), sources);
f (this. beanNameGenerator != nu1l).
loader. setBeanNameGenerator(this . beanNameGenerator);
if (this.resourceLoader != nu1l) {
loader . setResourceLoader(this . resourceLoader);
if (this. environment != null) {
loader . setEnvironment (this . environment) ;
loader. load();
}
该方法主要通过 BeanDefinitionL oader 来完成配置资源的加载操作。我们进一步查看方法createBeanDefinitionL oader 的源代码,会发现它最终调用了 BeanDefinitionL oader 的构造方法,并进行初始化操作。
BeanDefinitionLoader(BeanDefinitionRegistry registry, Object… sources) {
最后总结我的面试经验
2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。
另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
BAT面试经验
实战系列:Spring全家桶+Redis等
其他相关的电子书:源码+调优
面试真题:
T面试经验
实战系列:Spring全家桶+Redis等
[外链图片转存中…(img-EvkwKngj-1710370096571)]
其他相关的电子书:源码+调优
[外链图片转存中…(img-hBVMLm3P-1710370096571)]
面试真题:
[外链图片转存中…(img-JsI6cz49-1710370096572)]
[外链图片转存中…(img-lEb67nfL-1710370096572)]