目录
Spring Bean的生命周期是Spring面试热点问题。这个问题即考察对Spring的微观了解,又考察对Spring的宏观认识,想要答好并不容易!本文希望能够从源码角度入手,帮助面试者彻底搞定Spring Bean的生命周期。
在spring bean创建过程 依赖 BeanDefinition 中的信息处理bean的生产。BeanDefinition 是 Spring Framework 中定义 Bean 的配置元信息接口。
在处理配置文件生成BeanDefinition主要经过:Spring Bean 读取解析配置信息、spring bean 注册阶段、Spring BeanDefinition 合并阶段。
一、Spring Bean 读取解析配置信息
spring bean的配置信息分为:
- 1、面向资源
XML 配置的处理主要使用 :XmlBeanDefinitionReader
Properties 资源配置:PropertiesBeanDefinitionReader
- 2、面向注解
面向注解 BeanDefinition 解析: AnnotatedBeanDefinitionReader
1.1、 XML 配置的处理主要使用的事例
这里主要基于xml中的构造方法处理:
public class UserHolder {
private User user;
public UserHolder() {
}
public UserHolder(User user) {
this.user = user;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "UserHolder{" +
"user=" + user +
'}';
}
}
/**
* 基于 XML 资源的依赖 Constructor 注入示例
*
* @author
* @since
*/
public class XmlDependencyConstructorInjectionDemo {
public static void main(String[] args) {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
String xmlResourcePath = "classpath:/META-INF/dependency-constructor-injection.xml";
// 加载 XML 资源,解析并且生成 BeanDefinition
beanDefinitionReader.loadBeanDefinitions(xmlResourcePath);
// 依赖查找并且创建 Bean
UserHolder userHolder = beanFactory.getBean(UserHolder.class);
System.out.println(userHolder);
}
}
xml的配置文件
<?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="org.geekbang.thinking.in.spring.ioc.overview.domain.User">
<property name="id" value="1"/>
<property name="name" value="小马哥"/>
<property name="city" value="HANGZHOU"/>
<property name="workCities" val