目录
1.概述
XmlBeanFactory 继承自 DefaultListableBeanFactory, DefaultListableBeanFactory是整个bean加载的核心部分,是 Spring 注册及加载bean的默认实现。类图如下:
DefaultListableBeanFactory 实现接口 BeanDefinitionRegistry 的一些方法,具体看下经典文章:BeanDefinitionRegistry 增删改查 Bean
SimpleAliasRegistry 实现对 Bean 的别名的管理。
2、XmlBeanFactory
XmlBeanFactory 对DefaultListableBeanFactory进行了扩展,主要用于从 XML 配置文件中读取 BeanDefinition,对于注册和获取 Bean 都是使用父类 DefaultListableBeanFactory 继承的方法去实现。
XMLBeanFactory 中增加了 XmlBeanDefinitionReader 类型的reader 对资源文件进行读取和注册。
Resource 定位配置文件 --》 XmlBeanDefinitionReader 解析 Resource 读取注册BeanDefinition
3、示例
spring配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.suning.spring.boot.train.domain.User">
<property name="name" value="zhangsan"/>
<property name="id" value="1"/>
</bean>
</beans>
Bean类
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
Spring启动类
DefaultListableBeanFactory defaultListableBeanFactory = new XmlBeanFactory(new ClassPathResource("application-context.xml"));
User user = defaultListableBeanFactory.getBean(User.class);
System.out.println(user);
运行结果
4、XmlBeanDefinitionReader
Spring配置文件封装成 Resource 后,读取工作就交给 XmlBeanDefinitionReader来处理。
XmlBeanFactory 源码
public class XmlBeanFactory extends DefaultListableBeanFactory {
private final XmlBeanDefinitionReader reader;
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, (BeanFactory)null);
}
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
// 初始化
this.reader = new XmlBeanDefinitionReader(this);
// 解析 Resource 并加载 BeanDefinition
this.reader.loadBeanDefinitions(resource);
}
}
this.reader.loadBeanDefinitions(resource) 才是加载bean 的方法