Spring(九):Bean创建的最后一步——通知监听器

回顾

前面我们已经看了一个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事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值