栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

    • 回顾
    • 通知监听器对Bean的解析及注册完成
      • EmptyReaderEventListener
      • CollectiongReaderEventListener

回顾

前面我们已经看了一个Bean的注册流程

  • 注册BeanName
  • 注册Bean的别名

认识了一个重要的对象GenericApplicationContext,这个对象装饰了BeanFactory(DefaultListableBeanFactory),通过这个ApplicationContext去与IOC容器(DefaultListableBeanFactory的父类AbstractBeanFactory)进行交互

下面回到我们创建Bean的最后一步

通知监听器对Bean的解析及注册完成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JldKY1uR-1632842135426)(E:typoradImgimage-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 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 collection = this.componentDefinitions.values();
		return collection.toArray(new ComponentDefinition[0]);
	}

	@Override
	public void aliasRegistered(AliasDefinition aliasDefinition) {
        //存入alias事件
		List aliases = this.aliasMap.computeIfAbsent(aliasDefinition.getBeanName(), k -> new ArrayList<>());
		aliases.add(aliasDefinition);
	}

	public List getAliases(String beanName) {
		List 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 getimports() {
		return Collections.unmodifiableList(this.imports);
	}

至此一个Bean标签的解析及完成了,一个BeanDefinition创建成功了,整体的步骤为

  • 解析Bean标签,使用默认的标签去创建BeanDefinition对象
  • 修饰BeanDefinition,即解析自定义标签,然后装上新创建的BeanDefinition对象
  • 注册Bean:将创建的BeanDefinition对象添加进底层IOC容器中
  • 通知监听器:通知监听器发生了component事件
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/276386.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号