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

相关文章
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
1116 5
|
Java Spring 容器
两种Spring Boot 项目启动自动执行方法的实现方式
在Spring Boot项目启动后执行特定代码的实际应用场景中,可通过实现`ApplicationRunner`或`CommandLineRunner`接口完成初始化操作,如系统常量或配置加载。两者均支持通过`@Order`注解控制执行顺序,值越小优先级越高。区别在于参数接收方式:`CommandLineRunner`使用字符串数组,而`ApplicationRunner`采用`ApplicationArguments`对象。注意,`@Order`仅影响Bean执行顺序,不影响加载顺序。
967 2
|
人工智能 自然语言处理 Java
Spring 集成 DeepSeek 的 3大方法(史上最全)
DeepSeek 的 API 接口和 OpenAI 是兼容的。我们可以自定义 http client,按照 OpenAI 的rest 接口格式,去访问 DeepSeek。自定义 Client 集成DeepSeek ,可以通过以下步骤实现。步骤 1:准备工作访问 DeepSeek 的开发者平台,注册并获取 API 密钥。DeepSeek 提供了与 OpenAI 兼容的 API 端点(例如),确保你已获取正确的 API 地址。
Spring 集成 DeepSeek 的 3大方法(史上最全)
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
692 73
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
210 0
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
205 1
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
243 1
|
XML Java 数据格式
Spring BeanFactory深度讲解
Spring `BeanFactory` 是 Spring 容器的基础,负责创建、配置和管理 Bean 实例,并提供对 Bean 生命周期的管理和控制。它通过读取配置文件或注解来实例化和管理 Bean,支持 XML、Java 配置和注解配置方式。与 `ApplicationContext` 相比,`BeanFactory` 更轻量级,采用延迟加载策略,适用于资源受限的环境。它实现了工厂模式,将对象的创建和管理分离,使应用程序更灵活、可扩展且易于维护。
341 0
|
Java 应用服务中间件 Spring
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
670 5

热门文章

最新文章