Spring容器高级主题

来源:互联网 发布:淘宝有什么好的男鞋店 编辑:程序博客网 时间:2024/04/30 20:24

5.1 Spring容器技术内幕

5.1.1 内部工作机制

Spring的AbstractApplicationContext是ApplicationContext抽象实现类,该抽象类的refresh()方法定义了Spring容器在加载配置文件后的各项处理过程,这些处理清晰刻画了Spring容器启动时所执行的各项操作。

代码清单 AbstractApplicationContext#refresh()

//1初始化BeanFactory

ConfigurableListableBeanFactory beanFactory = getBeanFactory();

...//2调用工厂后处理器invokeBeanFactoryPostProcessors();//3注册Bean后处理器registerBeanPostProcessors();//4初始化消息源initMessageSource();//5初始化应用上下文事件广播器initApplicationEventMulticaster();//6初始化其他特殊的Bean:由具体子类实现onRefresh();//7注册事件监听器registerListeners();//8初始化所有单实例的Bean,使用懒汉模式的Bean除外finishBeanFactoryInitialization(beanFactory);//9完成刷新并发布容器刷新事件finishRefresh();

1、初始化BeanFactory:根据配置文件实例化BeanFactory,getBeanFactory()方法由具体子类实现。这一步,Spring将配置文件信息装入容器的Bean定义注册表(BeanDefinitionRegistry)中,此时Bean还未初始化。

2、调用工厂后处理器:根据反射机制从BeanDefinitionRegistry中找出所有BeanFactoryPostProcessor类型的Bean,并调用其postProcessBeanFactory()接口方法;

3、注册Bean后处理:根据反射机制从BeanDefinitionRegistry中找出所有BeanPostProcessor类型的Bean,并将他们注册到容器Bean后处理的注册表中;

4、初始化消息源:初始化容器的国际化消息资源;

5、初始化应用上下文事件广播器;

6、初始化其他特殊的Bean:这是一个钩子方法,子类可以借助这个方法执行一些特殊操作:如AbstractRefreshableWebApplicationContext就使用该方法执行初始化ThemeSource的操作;

7、注册事件监听器;

8、初始化所有单实例的Bean,使用懒汉模式的Bean除外:初始化Bean后,将他们放入Spring容器的缓存中;

9、发布上下文刷新事件:创建上下文刷新事件,事件广播器负责将这些事件广播到每个注册的事件监听器中。


1、ResourceLoader从存储介质中加载Spring配置信息,并使用Resource表示这个配置文件的资源;

2、BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中每一个<bean>解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中;

3、容器扫描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射机制自动识别出Bean工厂后处理器(实现BeanFactoryPostProcessor接口)的Bean,然后调用这些Bean工厂后处理器对BeanDefinitionRegistry中的BeanDefinition进行加工处理,主要完成两项工作:

1)对使用占位符的<bean>元素标签进行解析,得到最终配置值,意味着对一些半成品的BeanDefinition对象进行加工处理并得到成品的BeanDefinition对象;

2)对BeanDefinitionRegistry中的BeanDefinition进行扫描,通过Java反射机制找出所有属性编辑器的Bean(实现java.beans.PropertyEditor接口的Bean),并自动将他们注册到Spring容器的属性编辑器注册表中(PropertyEditorRegistry);

4、Spring容器从BeanDefinitionRegistry中取出加工后的BeanDefinition,并调用InstantiationStrategy着手进行Bean实例化的工作;

5、在实例化Bean时,Spring容器使用BeanWrapper对Bean进行封装,BeanWrapper提供很多以Java反射机制操作Bean的方法,将结合该Bean的BeanDefinition以及容器中属性编辑器,完成Bean属性的设置工作;

6、利用容器中注册的Bean后处理器(实现BeanPostProcessor接口的Bean)对已经完成属性设置工作的Bean进行后续加工,直接装配出一个准备就绪的Bean。

0 0
原创粉丝点击