spring复习:(35)在getBean时,在哪里根据普通bean和工厂bean进行区分处理来返回的?

这篇具有很好参考价值的文章主要介绍了spring复习:(35)在getBean时,在哪里根据普通bean和工厂bean进行区分处理来返回的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在AbstractBeanFactory的doGetBean方法:
spring复习:(35)在getBean时,在哪里根据普通bean和工厂bean进行区分处理来返回的?,Spring,spring,java,后端
调用的getObjectForBeanInstance方法部分代码如下:
spring复习:(35)在getBean时,在哪里根据普通bean和工厂bean进行区分处理来返回的?,Spring,spring,java,后端
如果不是工厂bean,则直接将实例返回,否则调用getObjectFromFactoryBean方法获取工厂bean的getObject方法返回的对象

	protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {
		if (factory.isSingleton() && containsSingleton(beanName)) {
			synchronized (getSingletonMutex()) {
				Object object = this.factoryBeanObjectCache.get(beanName);
				if (object == null) {
					object = doGetObjectFromFactoryBean(factory, beanName);
					// Only post-process and store if not put there already during getObject() call above
					// (e.g. because of circular reference processing triggered by custom getBean calls)
					Object alreadyThere = this.factoryBeanObjectCache.get(beanName);
					if (alreadyThere != null) {
						object = alreadyThere;
					}
					else {
						if (shouldPostProcess) {
							if (isSingletonCurrentlyInCreation(beanName)) {
								// Temporarily return non-post-processed object, not storing it yet..
								return object;
							}
							beforeSingletonCreation(beanName);
							try {
								object = postProcessObjectFromFactoryBean(object, beanName);
							}
							catch (Throwable ex) {
								throw new BeanCreationException(beanName,
										"Post-processing of FactoryBean's singleton object failed", ex);
							}
							finally {
								afterSingletonCreation(beanName);
							}
						}
						if (containsSingleton(beanName)) {
							this.factoryBeanObjectCache.put(beanName, object);
						}
					}
				}
				return object;
			}
		}
		else {
			Object object = doGetObjectFromFactoryBean(factory, beanName);
			if (shouldPostProcess) {
				try {
					object = postProcessObjectFromFactoryBean(object, beanName);
				}
				catch (Throwable ex) {
					throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);
				}
			}
			return object;
		}
	}

其中调用了doGetObjectFromFactoryBean方法,代码如下:
spring复习:(35)在getBean时,在哪里根据普通bean和工厂bean进行区分处理来返回的?,Spring,spring,java,后端
可以看到工厂bean的getObject方法被调用文章来源地址https://www.toymoban.com/news/detail-569697.html

到了这里,关于spring复习:(35)在getBean时,在哪里根据普通bean和工厂bean进行区分处理来返回的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?

    一、主类: 二、配置类: 三、singleton bean的创建流程 运行到context.refresh(); 进入refresh方法: 向下运行到红线位置时: 会实例化所有的singleton bean.进入finisheBeanFactoryInitialization方法: 向下拖动代码,可以看到beanFactory.preInstantiateSingletons(); 进入preInstantiateSingletons方法: 可以看

    2024年02月16日
    浏览(38)
  • SpringBoot复习:(42)WebServerCustomizer的customize方法是在哪里被调用的?

    ServletWebServletAutoConfiguration类定义如下: 可以看到其中通过@Import注解导入了其内部类BeanPostProcessorRegister。 BeanPostProcessor中定义的registerBeanDefinition方法会被Spring容器调用。 registerBeanDefinitions方法调用了RegistrySyntheticBeanIfMissing方法,这个方法代码如下: 可以看到它把传入的参数

    2024年02月13日
    浏览(42)
  • [SpringBoot]如何在一个普通类中获取一个Bean

    最近在项目中出现了一个这种情况:我一顿操作猛如虎的写了好几个设计模式,然后在设计模式中的类中想将数据插入数据库,因此调用Mapper持久层,但是数据怎么都写不进去,在我一顿操作猛如虎的查找下,发现在普通类中用 @Autowired 注入的Bean是Null,也就是说注入失败了

    2024年01月19日
    浏览(46)
  • SpringBoot复习:(45)@Component定义的bean会被@Bean定义的同名的bean覆盖

    有同名的bean需要配置: spring.main.allow-bean-definition-overriding=true 否则报错。 运行结果

    2024年02月13日
    浏览(34)
  • SpringBoot复习:(20)如何把bean手动注册到容器?

    可以通过实现BeanDefinitionRegistryPostProcessor接口,它的父接口是BeanFactoryPostProcessor. 步骤: 一、自定义一个组件类: 二、定义类实现BeanDefinitionRegistryPostProcessor: 通过@Component注解,Spring就能够扫描到MyBeanDefinitionRegistryPostProcessor,也就能够把MusicService这个组件注册到容器。 三、可

    2024年02月14日
    浏览(45)
  • 微信小程序中生成普通二维码,并根据二维码里的参数跳转对应的页面

    找到开发目录下面的 》 【开发管理】 》【开发设置】找到【扫普通链接二维码打开小程序】模块, 如图: 点击【添加】 例如: 我的生成二维码的链接地址是 服务器请求地址+需要跳转的参数 第一步:对要传递的参数进行编码 我要跳转到资讯页面, 服务器域名:https://x

    2024年02月08日
    浏览(46)
  • 35 Spring整合Elasticsearch

    spring-boot-starter-data-elasticsearch cluster-name集群名 cluster-nodes集群节点 如果项目中使用了redis,则需要解决冲突 es和redis都基于netty,这两者在启动netty时,会产生冲突:系统会认为redis已经启动了netty,es无法再启动 要尽可能在服务启动早期的时候,修改es.set.netty.runtime.available.pr

    2024年03月16日
    浏览(43)
  • 【源码】Spring Cloud Gateway 是在哪里匹配路由的?

    我们知道,经过网关的业务请求会被路由到后端真实的业务服务上去,假如我们使用的是Spring Cloud Gateway,那么你知道Spring Cloud Gateway是在哪一步去匹配路由的吗? 源码之下无秘密,让我们一起从源码中寻找答案。 Spring Cloud Gateway 的入口为 DispatcherHandler 的 handle 方法,其中主

    2023年04月24日
    浏览(38)
  • 54.Spring的AOP是在哪里创建的动态代理?

    正常的Bean会在Bean的生命周期的‘初始化’后, 通过BeanPostProcessor.postProcessAfterInitialization创建aop的动态代理 还有一种特殊情况: 循环依赖的Bean会在Bean的生命周期‘属性注入’时存在的循环依赖的情况下, 也会为循环依赖的Bean 通过MergedBeanDefinitionPostProcessor.postProcessMergedBe

    2024年02月02日
    浏览(40)
  • SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?

    @Value java doc文档指出,它是由 AutowiredAnnotationBeanPostProcessor 这个 BeanPostProcessor 处理的。 AutowiredAnnotationBeanPostProcessor的构造方法如下: 可见AutowiredAnnotationBeanPostProcessor用来处理@Autowired和@Value这两个注解。 具体的处理流程是通过在容器对bean进行实例化的时候应用上述BeanPostPr

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包