spring源码学习_bean的实例化过程

本文深入探讨了Spring框架中bean的实例化过程,从getBean方法开始,详细介绍了如何检查缓存、寻找父工厂以及依赖实例化。接着,文章详细讲解了bean的自动装配,特别是populateBean方法在@Autowried注解装配中的作用,以及findAutowiredAnnotation方法如何找到需要自动注入的属性。整个bean的自动注入流程清晰展现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇(spring源码学习_bean工厂的初始化)有说到,bean工厂初始化的最后一步就是将所有剩下的,在beanDefinitionMap中注册的,需要被实例化的bean全部实例化。其实例化过程最终是又 getBean 方法完成的,这里我们就重点看看getBean方法。

 

1.bean的实例化过程

public<T> T getBean(String name,@Nullable Class<T> requiredType,@Nullable Object...args)throws BeansException{

    return doGetBean(name,requiredType,args,false);
}


protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
			@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {

        //这里去掉工厂bean的前缀或者将别名转化为规范名
        final String beanName = transformedBeanName(name);
        Object bean;

        //这里尝试直接从singletonObjects(单例池)中获取bean的实例
        //最终被实例化的单例bean,都会被存放在singletonObjects中
        Object sharedInstance = getSingleton(beanName);
        if (sharedInstance != null && args == null) {
            //如果是工厂bean,获取工厂bean创建的bean,普通bean则直接返回
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
        }

        else {
            //如果这个bean已经在创建了,则抛出异常
            if (isPrototypeCurrentlyInCreation(beanName)) {
                throw new BeanCurrentlyInCreationException(beanName);
            }

            //获取父工厂
            BeanFactory parentBeanFactory = getParentBeanFactory();
            //当父工厂存在时,将实例化任务交给父工厂
            if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
                //......省略
                //这里调用了父工厂的getBean方法
            }

            if (!typeCheckOnly) {
                //将这个bean标记为已实例化状态
                markBeanAsCreated(beanName);
            }

            try {
                //获取到这个bean的 beanDefinition
                final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
                //这里检查了这个bean是否是Abstract的,是则抛出异常
                checkMergedBeanDefinition(mbd, beanName, args);
                
                //获取到这个bean的依赖信息
                String[] dependsOn = mbd.getDependsOn();
                if (dependsOn != null) {
                    for (String dep : dependsOn) {
                        //检查是否已经注册过该依赖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值