java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBean实例化

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

作者: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实例化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文