Spring源码--00--Spring IOC简述

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


IOC 流程图

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

流程步骤:

  1. 创建beanFactory容器
  2. 加载配置文件,解析bean定义信息,包装成BeanDefinition
  3. 执行BeanFactoryPostProcessor
  4. 准备BeanPostProcessor,广播器,监听器
  5. 实例化操作
  6. BeanPostProcessor-before
  7. 初始化操作
  8. BeanPostProcessor-after
  9. 获取对象
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Demo

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.6</version>
        </dependency>

User

package springdemo.cy.bean;

public class User {
    private String userId;
    private String userName;

    public User() {
    }

    public User(String userId, String userName) {
        this.userId = userId;
        this.userName = userName;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId='" + userId + '\'' +
                ", userName='" + userName + '\'' +
                '}';
    }
}

user.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="user1" class="springdemo.cy.bean.User">

        <property name="userId" value="0001"></property>
        <property name="userName" value="张三"></property>

    </bean>


    <bean id="user2" class="springdemo.cy.bean.User">

        <constructor-arg name="userId" value="0002"></constructor-arg>
        <constructor-arg name="userName" value="李四"></constructor-arg>
    </bean>

</beans>

test

package springdemo.cy.sp;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import springdemo.cy.bean.User;

public class test {

    public static void main(String[] args) {
       ApplicationContext appLication = new ClassPathXmlApplicationContext("user.xml");

        Object bean = appLication.getBean("user1");
        User user = (User) bean;
        System.out.println(user);

      }
}

在这里插入图片描述

Debug分析

1.启动类:ClassPathXmlApplicationContext

在这里插入图片描述
在这里插入图片描述

2.ClassPathXmlApplicationContext

构造方法
在这里插入图片描述
调用父类构造方法,进行相关的对象创建等操作,包含属性的赋值操作
在这里插入图片描述
在这里插入图片描述
进入refresh()
在这里插入图片描述

3.AbstractApplicationContext

在这里插入图片描述

prepareRefresh(); 做一些前期准备工作在这里插入图片描述

AbstractApplicationContext

在这里插入图片描述

在这里插入图片描述

4.AbstractRefreshableApplicationContext

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

new 一个 DefaultListableBeanFactory 在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

加载bean的定义信息 在这里插入图片描述

beandefinitionMap 在这里插入图片描述
在这里插入图片描述

一路返回到 3.AbstractApplicationContext

在这里插入图片描述
在这里插入图片描述

对BeanFactory做一些初始化设置在这里插入图片描述

在这里插入图片描述

留给子类做扩展用的方法

在这里插入图片描述

在这里插入图片描述

执行BeanFactoryPostProcessor 执行器

在这里插入图片描述
在这里插入图片描述

注册bean处理器,这里只是注册功能,真正调用的是getBean方法
在这里插入图片描述
为上下文初始化message源,即不同语言的消息体,国际化处理
在这里插入图片描述
初始化事件监听多路广播器
在这里插入图片描述
留给子类来初始化其他的bean
在这里插入图片描述
遍历应用程序中存在的监听器集合,并将对应的监听器添加到监听器的多路广播器中
在这里插入图片描述
在这里插入图片描述

实例化所有的剩下的非懒加载的单例对象

在这里插入图片描述
在这里插入图片描述

5.DefaultListableBeanFactory

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.AbstractBeanFactory

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

重要的判断 三级缓存是否有对象的方法 getSingleton()

	/**
	 * Return the (raw) singleton object registered under the given name.
	 * <p>Checks already instantiated singletons and also allows for an early
	 * reference to a currently created singleton (resolving a circular reference).
	 * @param beanName the name of the bean to look for
	 * @param allowEarlyReference whether early references should be created or not
	 * @return the registered singleton object, or {@code null} if none found
	 */
	@Nullable
	protected Object getSingleton(String beanName, boolean allowEarlyReference) {
		//从一级缓存获取
		Object singletonObject = this.singletonObjects.get(beanName);
		//如果一级缓存中没有,并且已标记这个bean正在被定义
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
			synchronized (this.singletonObjects) {
				//从二级缓存获取bean
				singletonObject = this.earlySingletonObjects.get(beanName);
				//如果二级缓存也拿不到 去三级缓存拿
				if (singletonObject == null && allowEarlyReference) {
					//从三级缓存取值
					ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						singletonObject = singletonFactory.getObject();
						//如果三级缓存存在值,将三级缓存中的缓存移除,加入二级缓存
						this.earlySingletonObjects.put(beanName, singletonObject);
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return singletonObject;
	}



然后进行一系列判断 ,直到createBean()方法,

再点进去

在这里插入图片描述

7.AbstractAutowireCapableBeanFactory

在这里插入图片描述

跳过一系列校验方法,知道do开头的重要方法

doCreateBean(beanName, mbdToUse, args);

在这里插入图片描述
在这里插入图片描述

点进去createBeanInstance方法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

进入instantiateBean(beanName, mbd);

在这里插入图片描述

进入 instantiate()方法

8.SimpleInstantiationStrategy

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

进入BeanUtils

9.BeanUtils

ctor.newInstance(argsWithDefaultValues)

通过反射创建目标对象

在这里插入图片描述

获取对象后一直返回,直到

AbstractAutowireCapableBeanFactory

7.AbstractAutowireCapableBeanFactory

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

DI注入 设置对象属性值

populateBean(beanName, mbd, instanceWrapper);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

进入 initializeBean( ) 初始化bean对象

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

一系列返回,到 DefaultListableBeanFactory类

5.DefaultListableBeanFactory

在这里插入图片描述

流程再走一遍,最后到AbstractApplicationContext类中

finishRefresh

  • 完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,
  • 同时发出ContextRefreshEvent通知别人

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值