Spring源码之Bean实例化基本原理

创建Spring Bean实例化是Spring Bean生命周期的第一阶段

Bean的生命周期主要有如下几个步骤:

「详细介绍:Spring In Action是这样讲的:」

  • 实例化Bean对象,这个时候Bean的对象是非常低级的,基本不能够被我们使用,因为连最基本的属性都没有设置,可以理解为连Autowired注解都是没有解析的;
  • 填充属性,当做完这一步,Bean对象基本是完整的了,可以理解为Autowired注解已经解析完毕,依赖注入完成了;
  • 如果Bean实现了BeanNameAware接口,则调用setBeanName方法;
  • 如果Bean实现了BeanClassLoaderAware接口,则调用setBeanClassLoader方法;
  • 如果Bean实现了BeanFactoryAware接口,则调用setBeanFactory方法;
  • 调用BeanPostProcessor的postProcessBeforeInitialization方法;
  • 如果Bean实现了InitializingBean接口,调用afterPropertiesSet方法;
  • 如果Bean定义了init-method方法,则调用Bean的init-method方法;
  • 调用BeanPostProcessor的postProcessAfterInitialization方法;当进行到这一步,Bean已经被准备就绪了,一直停留在应用的上下文中,直到被销毁;
  • 如果应用的上下文被销毁了,如果Bean实现了DisposableBean接口,则调用destroy方法,如果Bean定义了destory-method声明了销毁方法也会被调用。

在实例化Bean之前在BeanDefinition里头已经有了所有需要实例化时用到的元数据,接下来Spring只需要选择合适的实例化方法以及策略即可。

「BeanDefinition」

Spring容器启动的时候会定位我们的配置文件,加载文件,并解析成Bean的定义文件BeanDefinition

右边的Map里存储这bean之间的依赖关系的定义BeanDefinition,比如OrderController依赖OrderService这种

实例化方法有两大类分别是工厂方法和构造方法实例化,后者是最常见的。其中Spring默认的实例化方法就是无参构造函数实例化。

如我们在xml里定义的以及用注解标识的bean都是通过默认实例化方法实例化的

实例化方法

「使静态工厂方法实例化」

 
 
 
 
  1. public class FactoryInstance { 
  2.  
  3.     public FactoryInstance() { 
  4.         System.out.println("instance by FactoryInstance"); 
  5.     } 
 
 
 
 
  1. public class MyBeanFactory { 
  2.  
  3.     public static FactoryInstance getInstanceStatic(){ 
  4.         return new FactoryInstance(); 
  5.     } 
 
 
 
 
  1.  
  2.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  3.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 
  4.  
  5.     
  6.           factory-method="getInstanceStatic"/> 
  7.  

「使用实例工厂方法实例化」

 
 
 
 
  1. public class MyBeanFactory { 
  2.  
  3.     /** 
  4.      * 实例工厂创建bean实例 
  5.      * 
  6.      * @return 
  7.      */ 
  8.     public FactoryInstance getInstance() { 
  9.         return new FactoryInstance(); 
  10.     } 
 
 
 
 
  1.   
  2.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  
  4.