Spring杂记BeanFactory之getBean方法

简介: 1.(BeanFactory) getBean(beanName)   2.(AbstractBeanFactory) doGetBean     3.(AbstractBeanFactory) transformedBeanName //如果是&beanName工厂类形式去掉第一个&     4.

1.(BeanFactory) getBean(beanName)
  2.(AbstractBeanFactory) doGetBean
    3.(AbstractBeanFactory) transformedBeanName //如果是&beanName工厂类形式去掉第一个&
    4.(AbstractBeanFactory) getSingleton
      5.(DefaultSingletonBeanRegistry) getSingleton //从Map<String, Object> singletonObjects中获取实例如果存在的话(第一次不存在),有就返回
    6.(AbstractBeanFactory) getParentBeanFactory //看父类中是否包含了该beanName对应的实例,有就返回
    7.(AbstractBeanFactory) markBeanAsCreated(beanName) //this.alreadyCreated.add(beanName)
    8.(AbstractBeanFactory) getMergedLocalBeanDefinition(beanName)
      9.(AbstractBeanFactory) getMergedBeanDefinition(beanName, getBeanDefinition(beanName), null) //查看传入的bd是否有parentName,有的话需要合并。
      10.(AbstractBeanFactory) mbd.setScope(RootBeanDefinition.SCOPE_SINGLETON); //!StringUtils.hasLength(mbd.getScope()),如果该bean内部包含了一个非单例bean就将该bean的scope修正为内部的bean的scope
      11.(AbstractBeanFactory) this.mergedBeanDefinitions.put(beanName, mbd); //cache关系
    12.(AbstractBeanFactory) checkMergedBeanDefinition(mbd, beanName, args) //查看mbd.isAbstract(),是就抛出异常
    13.(AbstractBeanFactory) String[] dependsOn = mbd.getDependsOn(); //将依赖初始化
    14.(AbstractBeanFactory) sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() //如果是单例bean,就调用该方法
      15.(DefaultSingletonBeanRegistry) Object singletonObject = this.singletonObjects.get(beanName); //有就返回
        16.(AbstractBeanFactory) createBean(beanName, mbd, args)
          17.(AbstractAutowireCapableBeanFactory) createBean
            18.(AbstractAutowireCapableBeanFactory) mbd.prepareMethodOverrides
            19.(AbstractAutowireCapableBeanFactory) resolveBeforeInstantiation(beanName, mbd) // Give BeanPostProcessors a chance to return a proxy instead of the target bean 如果这步有bean就返回
            20.(AbstractAutowireCapableBeanFactory) doCreateBean(beanName, mbd, args)
              21.(AbstractAutowireCapableBeanFactory) createBeanInstance
                22.如果RootBeanDefinition mbd.getFactoryMethodName() != null就使用工厂方法初始化->instantiateUsingFactoryMethod(beanName, mbd, args)
                23.如果发现是构造器模式走23.1,否则走23.2
                  23.1.1.(AbstractAutowireCapableBeanFactory) autowireConstructor(beanName, mbd, ctors, args);
                    23.1.2.(ConstructorResolver) autowireConstructor
                    23.1.3.(ConstructorResolver) this.beanFactory.getInstantiationStrategy().instantiate(mbd, beanName, this.beanFactory, constructorToUse, argsToUse);
                      23.1.4.(SimpleInstantiationStrategy) instantiate
                  23.2.1.(AbstractAutowireCapableBeanFactory) instantiateBean(beanName, mbd)
                    23.2.2.(AbstractAutowireCapableBeanFactory) beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
              24.(AbstractAutowireCapableBeanFactory) populateBean(beanName, mbd, instanceWrapper);//填充属性
              25.(AbstractAutowireCapableBeanFactory) initializeBean(beanName, exposedObject, mbd)
                26.(AbstractAutowireCapableBeanFactory) invokeAwareMethods(beanName, bean)
                27.(AbstractAutowireCapableBeanFactory) applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)
                28.(AbstractAutowireCapableBeanFactory) invokeInitMethods(beanName, wrappedBean, mbd)
                29.(AbstractAutowireCapableBeanFactory) applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)
              30.(AbstractAutowireCapableBeanFactory) registerDisposableBeanIfNecessary(beanName, bean, mbd);
      31.(DefaultSingletonBeanRegistry) addSingleton //this.singletonObjects.put,this.registeredSingletons.add
    32.(AbstractAutowireCapableBeanFactory) getObjectForBeanInstance(sharedInstance, name, beanName, mbd) //如果beanName是&开头的就返回factoryBean
    33.//如果传入的requiredType不为空,则调用 getTypeConverter().convertIfNecessary(bean, requiredType)
  34. return bean
35. return bean

相关文章
|
8天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
12 1
|
9天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
16 1
|
14天前
|
存储 安全 Java
|
6天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
11 0
|
2月前
|
Java 应用服务中间件 Spring
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
|
2月前
|
XML Java 数据格式
Spring BeanFactory深度讲解
Spring `BeanFactory` 是 Spring 容器的基础,负责创建、配置和管理 Bean 实例,并提供对 Bean 生命周期的管理和控制。它通过读取配置文件或注解来实例化和管理 Bean,支持 XML、Java 配置和注解配置方式。与 `ApplicationContext` 相比,`BeanFactory` 更轻量级,采用延迟加载策略,适用于资源受限的环境。它实现了工厂模式,将对象的创建和管理分离,使应用程序更灵活、可扩展且易于维护。
|
4月前
|
安全 Java Spring
Spring问题之如何配置Bean的初始化方法和销毁方法
Spring问题之如何配置Bean的初始化方法和销毁方法
|
3月前
|
Java Spring
|
3月前
|
存储 SQL Java
|
4月前
|
Java Spring
Spring初始化加速的思路和方案问题之在BeanFactory#doGetBean方法中,栈状态的变化影响bean的初始化的问题如何解决
Spring初始化加速的思路和方案问题之在BeanFactory#doGetBean方法中,栈状态的变化影响bean的初始化的问题如何解决