SpringBean实例化的基本流程源码剖析
SpringBean实例化的基本流程
一、原理
Spring 容器在进行初始化时,会将 xml 配置的<bean>的信息封装成一个 BeanDefinition 对象,所有的BeanDefinition 存储到一个名为beanDefinitionMap的 Map 集合中去,Spring 框架在对该 Map 进行遍历,使用反射创建 Bean 实例对象,创建好的 Bean 对象存储在一个名为singletonObjects的 Map 集合中,当调用getBean方法时则最终从该 Map 集合中取出 Bean 实例对象返回。
二、实验部分
2.1验证 BeanDefinition 是存储bean标签的信息
applicationContext.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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl"></bean>
</beans>package com.itheima.test;
import com.alibaba.druid.pool.DruidDataSource;
import com.itheima.dao.impl.UserDaoImpl;
import com.itheima.service.UserService;
import com.mysql.jdbc.Connection;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javax.xml.bind.annotation.XmlAccessOrder;
import java.io.IOException;
import java.io.InputStream;
import java.sql.DriverManager;
public class BeanFactoryTest {
public static void main(String[] args) throws Exception {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext_beanfac.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
}
}此时由于xml中的userService没有传入属性,所以beanDefinitionMap中它的propertyValues为0:

加入property属性时:
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
</beans>
当然有更多的属性就不再一一演示了,详细的可以看下面这个图:

2.2源码剖析


依据信息找到源码可见beanFactory内部确实是维护着singletonObjects的 Map 集合。
三、总结
3.1详细流程


到此这篇关于SpringBean实例化的基本流程的文章就介绍到这了,更多相关SpringBean实例化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Kafka消费客户端协调器GroupCoordinator详解
这篇文章主要为大家介绍了Kafka消费客户端协调器GroupCoordinator使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-10-10
Mybatis-Plus updateById方法更新无效及空值处理过程
MyBatis-Plus的updateById默认不更新null值以防止误操作,可通过UpdateWrapper/LambdaUpdateWrapper显式设置,或全局配置、注解@TableField允许字段更新为空,需根据业务场景选择合适方式2025-07-07
SpringBoot整合log4j日志与HashMap的底层原理解析
这篇文章主要介绍了SpringBoot整合log4j日志与HashMap的底层原理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-01-01


最新评论