SpringBean實(shí)例化的基本流程源碼剖析
SpringBean實(shí)例化的基本流程
一、原理
Spring 容器在進(jìn)行初始化時(shí),會將 xml 配置的<bean>的信息封裝成一個(gè) BeanDefinition 對象,所有的BeanDefinition 存儲到一個(gè)名為beanDefinitionMap的 Map 集合中去,Spring 框架在對該 Map 進(jìn)行遍歷,使用反射創(chuàng)建 Bean 實(shí)例對象,創(chuàng)建好的 Bean 對象存儲在一個(gè)名為singletonObjects的 Map 集合中,當(dāng)調(diào)用getBean方法時(shí)則最終從該 Map 集合中取出 Bean 實(shí)例對象返回。
二、實(shí)驗(yàn)部分
2.1驗(yàn)證 BeanDefinition 是存儲bean標(biāo)簽的信息
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");
}
}此時(shí)由于xml中的userService沒有傳入屬性,所以beanDefinitionMap中它的propertyValues為0:

加入property屬性時(shí):
<?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>
當(dāng)然有更多的屬性就不再一一演示了,詳細(xì)的可以看下面這個(gè)圖:

2.2源碼剖析


依據(jù)信息找到源碼可見beanFactory內(nèi)部確實(shí)是維護(hù)著singletonObjects的 Map 集合。
三、總結(jié)
3.1詳細(xì)流程


到此這篇關(guān)于SpringBean實(shí)例化的基本流程的文章就介紹到這了,更多相關(guān)SpringBean實(shí)例化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于OAuth2.0授權(quán)系統(tǒng)的驗(yàn)證碼功能的實(shí)現(xiàn)
本篇教程給大家分享基于OAuth2.0授權(quán)系統(tǒng)的驗(yàn)證碼功能的實(shí)現(xiàn),驗(yàn)證碼功能的實(shí)現(xiàn)是采用Zuul網(wǎng)關(guān)的Filter過濾器進(jìn)行校驗(yàn)驗(yàn)證碼,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧2021-05-05
Java中構(gòu)造方法set/get和toString的使用詳解
這篇文章主要介紹了Java中構(gòu)造方法set/get和toString的使用詳解,構(gòu)造函數(shù)的最大作用就是創(chuàng)建對象時(shí)完成初始化,當(dāng)我們在new一個(gè)對象并傳入?yún)?shù)的時(shí)候,會自動調(diào)用構(gòu)造函數(shù)并完成參數(shù)的初始化,需要的朋友可以參考下2019-07-07
Spring中的@CrossOrigin注冊處理方法源碼解析
這篇文章主要介紹了Spring中的@CrossOrigin注冊處理方法源碼解析,@CrossOrigin是基于@RequestMapping,@RequestMapping注釋方法掃描注冊的起點(diǎn)是equestMappingHandlerMapping.afterPropertiesSet(),需要的朋友可以參考下2023-12-12
IDEA中Mybatis的MGB使用逆向工程配置的詳細(xì)教程
這篇文章主要介紹了IDEA中Mybatis的MGB使用逆向工程配置,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Spring?boot整合dubbo+zookeeper的詳細(xì)過程
本文講解Spring?Boot整合Dubbo與Zookeeper實(shí)現(xiàn)API、Provider、Consumer模式,包含依賴配置、啟動類注解、服務(wù)注冊與調(diào)用步驟,及QoS、超時(shí)、負(fù)載均衡等參數(shù)設(shè)置,確保分布式服務(wù)通信正常運(yùn)行,感興趣的朋友一起看看吧2025-07-07
Java添加事件監(jiān)聽的四種方法代碼實(shí)例
這篇文章主要介紹了Java添加事件監(jiān)聽的四種方法代碼實(shí)例,本文直接給出代碼示例,并用注釋說明,需要的朋友可以參考下2014-09-09
Java大數(shù)運(yùn)算BigInteger與進(jìn)制轉(zhuǎn)換詳解
這篇文章主要介紹了Java大數(shù)運(yùn)算BigInteger與進(jìn)制轉(zhuǎn)換詳解,Java 提供了 BigInteger(大整數(shù))類和 BigDecimal(大浮點(diǎn)數(shù))類用于大數(shù)運(yùn)算,這兩個(gè)類都繼承自 Number 類(抽象類),由于 BigInteger 在大數(shù)運(yùn)算中更常見,需要的朋友可以參考下2023-09-09

