在spring的IOC容器中,我们是采用什么数据结构来封装Bean的呢?
我们可以先假设:
因为bean是不可重复的,所以应该采用不可重复的数据结构来存储,这样的话应该采用的是HashSet和hashmap,但是hashset存储的只是对象,而hashmap存储键值对,所以我感觉还是hashmap
开始证明自己的想法:
首先我是从从ApplicationContext入手的
反正我一下没有找到在哪,后来我用另外一个BeanDefinitionRegistry:该类是管理bean的
看到getBeanDefinitionCount()
查看它的子实现
找到了底层存储采用的是ConcurrentHashMap,一个线程安全的HashMap实现的。
IOC容器的底层创建:
1.ioc创建对象
2.refresh()-》invokeBeanFactoryPostProcessors(beanFactory);
3.从容器中获取所有的BeanDefinitionRegistryPostProcessor组件。
1.依次触发所有的postProcessBeanDefinitionRegistry()方法
2.再来触发postProcessBeanFactory()方法BeanFactoryPostProcessor;
4.再来从容器中找到BeanFactoryPostProcessor组件,然后依次触发PostProcessBeanFactory()方法
ApplicationListener:监听容器中发布的事件。事件驱动模型开发;
需要继承ApplicationListener
监听ApplicationEvent及其下面的子事件。
创建MyApplicationListener继承ApplicationListener
打印输出的事件
运行控制台打印:
通过注解方式实现事件监听接口
运行查看打印