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都是通过默认实例化方法实例化的
实例化方法
「使静态工厂方法实例化」
- public class FactoryInstance {
- public FactoryInstance() {
- System.out.println("instance by FactoryInstance");
- }
- }
- public class MyBeanFactory {
- public static FactoryInstance getInstanceStatic(){
- return new FactoryInstance();
- }
- }
- 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
- factory-method="getInstanceStatic"/>
「使用实例工厂方法实例化」
- public class MyBeanFactory {
- /**
- * 实例工厂创建bean实例
- *
- * @return
- */
- public FactoryInstance getInstance() {
- return new FactoryInstance();
- }
- }
- 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


咨询
建站咨询
