Spring源码解析之加载bean实例(1)

本文探讨了Spring的两大阶段:容器初始化和bean加载。在初始化阶段,Spring解析配置并生成BeanDefinition对象注册到BeanDefinitionRegistry。加载bean时,通过getBean()方法,检查并实例化bean,处理依赖。getBean()的参数包括bean名称、类型、构造参数和类型检查选项。文章还简要分析了getBean()加载过程及transformedBeanName()方法的作用,包括处理FactoryBean和别名。
摘要由CSDN通过智能技术生成

    Spring的整个流程主要分为两个阶段:容器初始化阶段和加载bean阶段。

    容器初始化阶段:首先通过加载Configuration,然后容器会对加载的Configuration进行解析和分析,并将分析的信息组装成BeanDefinition对象,并将其保存注册到相应的BeanDefinitionRegistry中。至此是SpringIOC的初始化过程。

    加载bean的阶段:进过容器初始化阶段后,应用程序中定义的bean信息已经全部加载到系统中,当我们显式或者隐式的调用getBean()时,则会触发加载bean阶段。在这阶段,容器会首先检查所请求的对象是否已经初始化完成了,如果没有,则会根据注册的 bean 信息实例化请求的对象,并为其注册依赖,然后将其返回给请求方。至此第二个阶段也已经完成。

  而 getBean()作为加载bean的入口方法,接收四个参数:

  • name:要获取bean的名字
  • requiredType:要获取bean的实例
  • args:创建bean时传递的参数。
  • typeCheckOnly:是否为类型检查

    源码如下:        

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

        //将name转换为beanName,如果是别名 会转换为对应的beanName
        final String beanName = transformedBeanName(name);
        Object bean;

        //从缓存中获取单例bean
        Object sharedInstance = getSingleton(beanName);
        if (sharedInstance != null && args == null) {
            if (logger.isDebugEnabled()) {
                if (isSingletonCurrentlyInCreation(beanName)) {
                    logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +
                            "' that is not fully initialized yet - a consequence of a circular reference");
                }
                else {
                    logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
                }
            }
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
        }

        e
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值