spring源码分析——堆内存中创建bean对象

 

  bean的生命周期中首先是在内存中开辟存储空间,然后反射创建对象,创建对象后,依赖注入,设置bean的属性,初始化bean,最后

放入缓存中,返回bean对象,这里我们分析一下第一步,bean的创建

 准备工作:创建一个Student类,添加注解Component

@Component("student")
public class Student extends User{

	private int height;

	private String weight;

	public Student(){

	}

	public Student(int height,String weight){
		this.height = height;
		this.weight = weight;
	}

	@Override
	public void study() {
		System.out.println("学生更要好好学习......");
	}

	@Override public String toString() {
		final StringBuffer sb = new StringBuffer("Student{");
		sb.append("height=").append(height);
		sb.append(", weight='").append(weight).append('\'');
		sb.append('}');
		return sb.toString();
	}
}

  

测试用例:

	public static void main(String[] args) {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
		Student student = (Student)context.getBean("student");
		System.out.println(student);
	}

  

运行结果:

 

 

一:下面看一下源码中bean的创建流程,我们首先看一下无参数构造器创建bean对象

在doCreateBean方法中,createBeanInstance方法创建对象

 

 

 

 

 

 

 

 

通过class类拿到无参数构造器,然后反射创建bean对象:

 

 

做一个封装,然后返回封装后的对象:

 

 

以上就是无参数构造器的实例化过程,下面看一下有参数构造器的实例化过程:

二:有参数构造器的实例化过程

准备工作:注释掉Component注解

 

 通过xml配置,构造器注入参数:

 

 运行结果:

 

 

下面从源码层面分析一下有参数构造器的实例化过程:

 

 

进入autowireConstructor方法:

 

 

 

 

 

 

 

 实例化后的对象封装到bw中,返回

 

 

总结:bean的实例很简单,步骤如下:

1:寻找class类,从beanDefinition上的属性

2:根据class类获取构造器,如果是有参数的获取有参构造,如果是无参数的获取无参数构造器

3:无参数构造器直接实例化对象,然后封装返回,有参数构造器需要寻找参数,然后调用构造器方法实例化对象,然后封装返回。

 

posted @ 2020-06-30 11:03  warrior1234  阅读(535)  评论(0编辑  收藏  举报