回顾
前面我们已经看了一个Bean的注册流程
- 注册BeanName
- 注册Bean的别名
认识了一个重要的对象GenericApplicationContext,这个对象装饰了BeanFactory(DefaultListableBeanFactory),通过这个ApplicationContext去与IOC容器(DefaultListableBeanFactory的父类AbstractBeanFactory)进行交互
下面回到我们创建Bean的最后一步
通知监听器对Bean的解析及注册完成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JldKY1uR-1632842135426)(E:\typoradImg\image-20210928150759674.png)]
下面那行代码就是通知监听器的代码
要注意这里的实现只为扩展,当我们进行开发的时候需要对注册BeanDefinition事件进行监听时可以通过注册监听器的方式将处理逻辑写入监听器中,目前在默认的Spring中没有对此做任何处理,从中也看到了Spring这里采用了观察者模式,XmlReaderContext为发布者,其内部认知了一个监听器(监听器为订阅者,说白了就是ReaderEventListener接口),当事件发生后,发布者向订阅者发布通知
而且可以看到,这个监听器获取是从配置文件里面获取的(getReaderContext)
从代码上可以看到,Spring将监听器抽象成了ReaderEventListener接口,而这个接口提供了4个方法
- defaultRegistered:通知给定的默认值,也就是默认值通知(参数为传来的默认Bean)
- componentRegistered:通知给定的组件,也就是组件通知,也就是bean标签(参数为传来的Bean)
- aliasRegistered:通知给定的alisa,也就是alias标签
- importedProcessed:通知给定的import,也就是import实现
而且关于ReaderEvenListener接口有两个实现类
- EmptyReaderEventListener:什么都不干的监听器,简称空监听器(默认实现)
- CollectingReaderEventListener:Spring提供的一个底层实现为集合的监听器,简称集合监听器
EmptyReaderEventListener
下面就来看这个EmptyReaderEventListener收到信息后做了什么
可以看到,什么都没做,真够Empty的
CollectiongReaderEventListener
这个监听器说白了就是将ContextReader发过来的事件记录下来!
其底层是使用这4个容器来记录发生的事件,比如成功注册一个Bean,会存放在ComponentDefinitions中
可以看一下这些方法
@Override
public void defaultsRegistered(DefaultsDefinition defaultsDefinition) {
//default事件存入defaults集合中
this.defaults.add(defaultsDefinition);
}
//提供default事件的defaults集合的get方法
public List<DefaultsDefinition> getDefaults() {
return Collections.unmodifiableList(this.defaults);
}
@Override
public void componentRegistered(ComponentDefinition componentDefinition) {
//component事件存入componentDefinitions集合中
this.componentDefinitions.put(componentDefinition.getName(), componentDefinition);
}
//提供component所有事件的componentDefinitions集合的get方法
public ComponentDefinition getComponentDefinition(String name) {
return this.componentDefinitions.get(name);
}
public ComponentDefinition[] getComponentDefinitions() {
Collection<ComponentDefinition> collection = this.componentDefinitions.values();
return collection.toArray(new ComponentDefinition[0]);
}
@Override
public void aliasRegistered(AliasDefinition aliasDefinition) {
//存入alias事件
List<AliasDefinition> aliases = this.aliasMap.computeIfAbsent(aliasDefinition.getBeanName(), k -> new ArrayList<>());
aliases.add(aliasDefinition);
}
public List<AliasDefinition> getAliases(String beanName) {
List<AliasDefinition> aliases = this.aliasMap.get(beanName);
return (aliases != null ? Collections.unmodifiableList(aliases) : null);
}
@Override
public void importProcessed(ImportDefinition importDefinition) {
//存入import事件
this.imports.add(importDefinition);
}
public List<ImportDefinition> getImports() {
return Collections.unmodifiableList(this.imports);
}
至此一个Bean标签的解析及完成了,一个BeanDefinition创建成功了,整体的步骤为
- 解析Bean标签,使用默认的标签去创建BeanDefinition对象
- 修饰BeanDefinition,即解析自定义标签,然后装上新创建的BeanDefinition对象
- 注册Bean:将创建的BeanDefinition对象添加进底层IOC容器中
- 通知监听器:通知监听器发生了component事件