基本概念
BeanDefinitionReader ,该接口的作用就是加载 Bean。
在 Spring 中,Bean 一般来说都在配置文件中定义。而在配置的路径由在 web.xml 中定义。所以加载 Bean 的步骤大致就是:
下面来看它的接口定义:
public interface BeanDefinitionReader {
BeanDefinitionRegistry getRegistry();
ResourceLoader getResourceLoader();
ClassLoader getBeanClassLoader();
BeanNameGenerator getBeanNameGenerator();
// 通过 Resource 加载 Bean
int loadBeanDefinitions(Resource resource)
throws BeanDefinitionStoreException;
int loadBeanDefinitions(Resource... resources)
throws BeanDefinitionStoreException;
// 通过 location 加载资源
int loadBeanDefinitions(String location)
throws BeanDefinitionStoreException;
int loadBeanDefinitions(String... locations)
throws BeanDefinitionStoreException;
}
具体的继承关系如下:
流程分析
首先来看 Spring Ioc 容器从启动开始到调用 BeanDefinitionReader 加载 Bean 的过程如下:
注意:由于这里采用 XML 文件作为 Spring 的配置文件,所以默认调用 XmlBeanDefinitionReader 来处理。
1.通过 BeanFactory 加载 Bean
在 Spring 容器(ApplicationContext)内部存在一个内部容器(BeanFactory)负责 Bean 的创建与管理。
在创建完 BeanFactory ,下一步就是要去加载 Bean。它由 loadBeanDefinitions 方法负责。
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
throws BeansException, IOException {
// 1.创建 BeanDefinitionReader
XmlBeanDefinitionReader beanDefinitionReader =
new XmlBeanDefinitionReader(beanFactory);
// 2.设置 BeanDefinitionReader 的相关属性
// 2.1.设置 Environment,即环境,与容器的环境一致
beanDefinitionReader.set