Spring深入理解之IOC其他补充

前言

前面两篇博客针对Spring IOC做了大致的流程说明。
Spring深入理解之IOC、DI
Spring深入理解之IOC创建并获取Bean

IOC的作用在于Spring对Bean的创建和管理,其中分为三大块内容:

  • BeanFactory
    bean的创建和管理。
  • BeanDefinition
    bean的定义,使BeanFactory根据BeanDefinition创建bean。
  • BeanDefinitionReader
    读取xml或者properties中定义的bean信息,转化为BeanDefinition

但在实际使用中,并非是直接通过XmlBeanDefinitionReader实现操作,通常情况下,会使用ClassPathXmlApplicationContext实现加载、解析、注册等操作。

测试案例

bean1.xml:

<bean id="testDemo1" class="cn.linkpower.TestDemo1" scope="prototype" >bean>

TestDemo1.java:

public class TestDemo1 {
	public void add() {
		System.out.println("add ......");
	}

	public TestDemo1() {
		System.out.println("TestDemo1 ......");
	}
	
}

测试类:

	/**
	 * 通过xml方式,加载bean
	 */
	@Test
	public void testXml() {
		//加载配置文件
		ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
		TestDemo1 testDemo1 = (TestDemo1) context.getBean("testDemo1");
		System.out.println(testDemo1);
	}

整体流程解析

1、加载资源 xml
2、先创建BeanFactory,解析xml文件至BeanDefinition并注册至factory中
3、对beanfactory初始化,对bean(singleton单例、非带有LazyInit的延迟加载、非抽象的bean)进行创建

断点测试

针对TestDemo1.java的创建进行断点测试(TestDemo1的构造方法)
Spring深入理解之IOC其他补充_第1张图片

Spring深入理解之IOC其他补充_第2张图片

完整流程

Spring深入理解之IOC其他补充_第3张图片

为什么加载时,只对单例、非带有延迟加载、非抽象的bean进行创建

在源码追踪中,可以看见,当factory初始化所有的单例流程时的源码:
Spring深入理解之IOC其他补充_第4张图片
在此处做了限制。其次针对多例,也没必要优先创建bean,在需要使用时,创建一个新的对象即可。

你可能感兴趣的:(Spring框架相关)