SpringBean实例化的基本流程源码剖析

 更新时间:2026年01月26日 11:07:52   作者:MX_9359  
Spring容器通过BeanDefinition对象和singletonObjects Map集合管理Bean实例化过程,实现依赖注入和控制反转,本文给大家介绍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实例化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于OAuth2.0授权系统的验证码功能的实现

    基于OAuth2.0授权系统的验证码功能的实现

    本篇教程给大家分享基于OAuth2.0授权系统的验证码功能的实现,验证码功能的实现是采用Zuul网关的Filter过滤器进行校验验证码,具体实现代码跟随小编一起看看吧
    2021-05-05
  • Java中构造方法set/get和toString的使用详解

    Java中构造方法set/get和toString的使用详解

    这篇文章主要介绍了Java中构造方法set/get和toString的使用详解,构造函数的最大作用就是创建对象时完成初始化,当我们在new一个对象并传入参数的时候,会自动调用构造函数并完成参数的初始化,需要的朋友可以参考下
    2019-07-07
  • java并发锁的实现

    java并发锁的实现

    Java中的锁主要是为了解决多个线程访问共享数据时的竞争问题,确保线程能够安全地访问和修改共享数据,本文主要介绍了java并发锁的实现,感兴趣的可以了解一下
    2024-04-04
  • JVM:你知道为什么对象一定在堆中分配吗

    JVM:你知道为什么对象一定在堆中分配吗

    这篇文章主要介绍了jvm对象的创建和分配的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下,希望能够给你带来帮助
    2021-08-08
  • 浅谈Maven Wrapper

    浅谈Maven Wrapper

    这篇文章主要介绍了浅谈Maven Wrapper,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Spring中的@CrossOrigin注册处理方法源码解析

    Spring中的@CrossOrigin注册处理方法源码解析

    这篇文章主要介绍了Spring中的@CrossOrigin注册处理方法源码解析,@CrossOrigin是基于@RequestMapping,@RequestMapping注释方法扫描注册的起点是equestMappingHandlerMapping.afterPropertiesSet(),需要的朋友可以参考下
    2023-12-12
  • IDEA中Mybatis的MGB使用逆向工程配置的详细教程

    IDEA中Mybatis的MGB使用逆向工程配置的详细教程

    这篇文章主要介绍了IDEA中Mybatis的MGB使用逆向工程配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Spring boot整合dubbo+zookeeper的详细过程

    Spring boot整合dubbo+zookeeper的详细过程

    本文讲解Spring Boot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、启动类注解、服务注册与调用步骤,及QoS、超时、负载均衡等参数设置,确保分布式服务通信正常运行,感兴趣的朋友一起看看吧
    2025-07-07
  • Java添加事件监听的四种方法代码实例

    Java添加事件监听的四种方法代码实例

    这篇文章主要介绍了Java添加事件监听的四种方法代码实例,本文直接给出代码示例,并用注释说明,需要的朋友可以参考下
    2014-09-09
  • Java大数运算BigInteger与进制转换详解

    Java大数运算BigInteger与进制转换详解

    这篇文章主要介绍了Java大数运算BigInteger与进制转换详解,Java 提供了 BigInteger(大整数)类和 BigDecimal(大浮点数)类用于大数运算,这两个类都继承自 Number 类(抽象类),由于 BigInteger 在大数运算中更常见,需要的朋友可以参考下
    2023-09-09

最新评论