Spring Bean实例化过程

Created with Raphaël 2.2.0 finishBeanFactoryInitialization(beanFactory) 对所有非懒加载的单例对象实例化入口 setConversionService 类型转换服务 addEmbeddedValueResolver 设置内置值处理器 freezeConfiguration 冻结BeanDefinition preInstantiateSingletons 开始对象的实例化 List<String> beanNames = new ArrayList<>(this.beanDefinitionNames) 从容器中获取所有BeanDefinition集合 遍历集合中的每一个元素,进行对象的创建 根据beanName获取beanDefiniton对象, 如果不是RootDefinition,转化为RootBeanDefinition bd对象是单例且非抽象且非懒加载? isFactoryBean? 根据&+beanName获取对象 是否需要立即加载 getBean() 获取对象 doGetBean transformedBeanName 转化bean名称 getSingleton 一、二、三级缓存是否有当前beanName的Bean 获取并返回当前bean对象 beanName是否有factoryBean(&)标识? yes分支获取FactoryBean no分支向下获取单例对象或者是FactoryBean实际对象 NullBean? 返回bean实例 FactoryBean? 抛出异常 beanInstance instanceof FactoryBean? yes分支向下获取FactoryBean实际对象 no分支获取单例对象 doGetObjectFromFactoryBean 从FactoryBean中获取对象 开始创建Bean对象 直接跳过 yes no yes no yes yes no yes no yes no yes no yes no

1: FactoryBean 加载与获取过程

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
       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">

	<bean id="myFactoryBean" class="com.self.factory.bean.MyFactoryBean"/>

</beans>

public class MyFactoryBean implements FactoryBean<FactoryBeanBean> {
	@Override
	public FactoryBeanBean getObject() throws Exception {
		FactoryBeanBean factoryBeanBean = new FactoryBeanBean();
		factoryBeanBean.setName("zhangyi");
		return factoryBeanBean;
	}

	@Override
	public Class<?> getObjectType() {
		return FactoryBeanBean.class;
	}

	@Override
	public boolean isSingleton() {
		return FactoryBean.super.isSingleton();
	}
}

public class FactoryBeanTest {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("factory-bean.xml");
		Object myFactoryBean = classPathXmlApplicationContext.getBean("&myFactoryBean");
		FactoryBeanBean factoryBeanBean = (FactoryBeanBean) classPathXmlApplicationContext.getBean("myFactoryBean");
		System.out.println(factoryBeanBean.getName());
	}
}

MyFactoryBean 通过doCreateBean创建, 位于一级缓存
MyFactoryBean 通过 doGetObjectFromFactoryBean创建实际对象
创建出的实际bean对象位于factoryBeanObjectCache

	@Override
	public boolean isSingleton() {
		return false;
	}

如果指定非单例,则不会放入缓存,每次请求实际对象都将新建一个新的对象,此时不再受spring管理。

此过程对应于流程图中的 获取并返回当前bean对象
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值