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

这篇具有很好参考价值的文章主要介绍了spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、主类:
spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?,Spring,spring,单例模式,缓存
二、配置类:
spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?,Spring,spring,单例模式,缓存
三、singleton bean的创建流程
运行到context.refresh();
spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?,Spring,spring,单例模式,缓存
进入refresh方法:
spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?,Spring,spring,单例模式,缓存
向下运行到红线位置时:
spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?,Spring,spring,单例模式,缓存
会实例化所有的singleton bean.进入finisheBeanFactoryInitialization方法:
spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?,Spring,spring,单例模式,缓存
向下拖动代码,可以看到beanFactory.preInstantiateSingletons();
spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?,Spring,spring,单例模式,缓存
进入preInstantiateSingletons方法:

	public void preInstantiateSingletons() throws BeansException {
		if (logger.isTraceEnabled()) {
			logger.trace("Pre-instantiating singletons in " + this);
		}

		// Iterate over a copy to allow for init methods which in turn register new bean definitions.
		// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
		List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

		// Trigger initialization of all non-lazy singleton beans...
		for (String beanName : beanNames) {
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
				if (isFactoryBean(beanName)) {
					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
					if (bean instanceof FactoryBean) {
						final FactoryBean<?> factory = (FactoryBean<?>) bean;
						boolean isEagerInit;
						if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
							isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
											((SmartFactoryBean<?>) factory)::isEagerInit,
									getAccessControlContext());
						}
						else {
							isEagerInit = (factory instanceof SmartFactoryBean &&
									((SmartFactoryBean<?>) factory).isEagerInit());
						}
						if (isEagerInit) {
							getBean(beanName);
						}
					}
				}
				else {
					getBean(beanName);
				}
			}
		}

		// Trigger post-initialization callback for all applicable beans...
		for (String beanName : beanNames) {
			Object singletonInstance = getSingleton(beanName);
			if (singletonInstance instanceof SmartInitializingSingleton) {
				final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
				if (System.getSecurityManager() != null) {
					AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
						smartSingleton.afterSingletonsInstantiated();
						return null;
					}, getAccessControlContext());
				}
				else {
					smartSingleton.afterSingletonsInstantiated();
				}
			}
		}
	}

可以看到实例化singleton bean的代码:
spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?,Spring,spring,单例模式,缓存
可以看到对非abstract、singleton的、非懒加载的bean,则会调用getBean方法创建bean并缓存(getBean方法的流程不再详述)
spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?,Spring,spring,单例模式,缓存文章来源地址https://www.toymoban.com/news/detail-600333.html

到了这里,关于spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Spring系列二:基于注解配置bean【建议收藏】

    Spring系列二:基于注解配置bean【建议收藏】

    上文中, 我们学习到了 Spring系列一:spring的安装与使用 接下来我们学习, 通过XML配置bean Bean管理包括两方面: 创建bean对象, 给bean注入属性 案例: 通过spring的ioc容器, 获取一个bean对象, 获取方式: 按类型. 演示通过bean的类型获取对象 细节 按照类型获取bean, 要求ioc容器中的同一个

    2024年02月14日
    浏览(11)
  • Spring注解驱动开发之常用注解案例_告别在XML中配置Bean

    注解驱动开发就是不再使用Spring的bean.xml文件,改为纯使用注解的方式开发 @Configuration 此注解为配置类注解,相当于spring.xml文件,即配置类==配置文件 @Bean 给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id 示例 Person类(后续注解配置类中都会以此类举例),

    2024年01月21日
    浏览(14)
  • Spring框架中的Singleton和Prototype Bean作用域

    Spring框架中的Singleton和Prototype Bean作用域

    Spring框架是依赖注入的事实上的框架,在开发可扩展、弹性和安全的云原生环境中具有良好的记录。 在使用Spring Beans时,初学者经常会对Spring beans和它们的作用域感到有些困惑。 以下是我对Singleton和Prototype Bean作用域的简单示例进行阐述的尝试。 Singleton Bean作用域 :正如其

    2024年02月11日
    浏览(13)
  • Spring 6.0官方文档示例(23): singleton类型的bean和prototype类型的bean协同工作的方法(二)

    使用lookup-method: 一、实体类: 二、配置文件: 三、主类:

    2024年02月15日
    浏览(12)
  • Spring 6.0官方文档示例(22): singleton类型的bean和prototype类型的bean协同工作的方法(一)

    一、配置文件: 二、实体类 三、主类:

    2024年02月15日
    浏览(15)
  • 一起学SF框架系列5.8-spring-Beans-Bean注解解析3-解析配置component-scan

    本文主要讲述Spring是如何解析“context:component-scan”元素,扫描加载目录下的BeanDefinition。 1、解析的元素如下: 注:该元素解析过程中,会自动处理“context:annotation-config/”元素要解析的内容。 2、只扫描加载目录下的BeanDefinition,不对注解进行解析。在AbstractApplicationContext.

    2024年02月16日
    浏览(10)
  • Spring IOC @Configuration注解分析

    在使用SpringBoot开发时,最常用的注解有@Component、@Service、@Controller、@Configuration等。当类使用这些注解标记时,类会被Spring IOC容器管理,包括创建,填充属性和实例化。 但是Spring容器如何发现并将这些类放到容器进行管理呢? 今天这篇博客主要分析Spring如何处理@Configuratio

    2024年02月08日
    浏览(13)
  • 使用@Configuration和@Bean给spring容器中注入组件

    以前我们是使用配置文件来注册bean的,现如今可以用@Configuration 来代替配置文件。

    2024年02月11日
    浏览(14)
  • [Spring6.0源码解析]简述@Configuration注解

    @Configuration 标注在类上,启动 Spring 会自动扫描 @Configuration 注解的类,将其注册到IOC容器并实例化bean对象。如果在 @Configuration 注解的类中使用 @Bean 注解某个类对象的方法,Spring也会自动将注解了 @Bean 的方法注册到IOC容器,并进行实例化。 @Configuration 注解本质上是个 @Compo

    2023年04月11日
    浏览(17)
  • spring复习:(55)注解配置的情况下@ComponentScan指定的包中的组件是怎么被注册到容器的?

    spring复习:(55)注解配置的情况下@ComponentScan指定的包中的组件是怎么被注册到容器的?

    配置类: 主类: 结论:是在context.refresh()处完成扫描和注册的。 fresh()的代码片段如下: 其中调用的invokeBeanFactoryPostProcessor代码如下: 其中调用的静态方法invokeBeanFactoryPostProcessors代码如下: 其中包含如下代码片段: invokeBeanDefinitionRegisteyPostProcessor的代码如下: 其中调用的

    2024年02月15日
    浏览(11)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包