Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析

这篇具有很好参考价值的文章主要介绍了Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

源码分析

以上一篇文章《Spring之Bean的生命周期》的代码进行源码分析

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig02.class);
LifeCycleBean lifeCycleBean = applicationContext.getBean("lifeCycleBean", LifeCycleBean.class);
System.out.println("-----------------------------------");
System.out.println("LifeCycleBean " + lifeCycleBean);
System.out.println("-----------------------------------");
applicationContext.close();

new AnnotationConfigApplicationContext(SpringConfig02.class)

AnnotationConfigApplicationContext.java

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析,Spring,mr,spring,java

AbstractApplicationContext.java

@Override
public void refresh() throws BeansException, IllegalStateException {
	synchronized (this.startupShutdownMonitor) {
		// Prepare this context for refreshing.
		// 容器刷新前的准备工作,例如对系统属性、环境变量进行准备及验证
		prepareRefresh();

		// Tell the subclass to refresh the internal bean factory.
		// 初始化BeanFactory
		ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

		// Prepare the bean factory for use in this context.
		// 对BeanFactory进行属性填充及功能填充,例如添加某些BeanPostProcessor以实现某些功能(ApplicationContextAwareProcessor)
		prepareBeanFactory(beanFactory);

		try {
			// Allows post-processing of the bean factory in context subclasses.
			// 空方法,用于子类实现扩展功能
			postProcessBeanFactory(beanFactory);

			// Invoke factory processors registered as beans in the context.
			// 执行BeanFactoryPostProcessor,例如ConfigurationClassPostProcessor、EventListenerMethodProcessor以及某些自定义的BeanFactoryPostProcessor
			// ConfigurationClassPostProcessor用于处理配置类,会将配置类中需要注册的Bean对象的元数据解析并存入beanDefinitionMap集合中
			invokeBeanFactoryPostProcessors(beanFactory);

			// Register bean processors that intercept bean creation.
			// 注册BeanPostProcessor,例如AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor以及某些自定义的BeanPostProcessor
			registerBeanPostProcessors(beanFactory);

			// Initialize message source for this context.
			// 初始化消息资源,国际化处理
			initMessageSource();

			// Initialize event multicaster for this context.
			// 初始化消息多播器
			initApplicationEventMulticaster();

			// Initialize other special beans in specific context subclasses.
			// 空方法,用于子类实现扩展功能
			onRefresh();

			// Check for listener beans and register them.
			// 注册所有的ApplicationListener到消息多播器
			registerListeners();

			// Instantiate all remaining (non-lazy-init) singletons.
			// 实例化、初始化剩下的非懒加载的单例对象
			finishBeanFactoryInitialization(beanFactory);

			// Last step: publish corresponding event.
			// 完成刷新动作,启动LifecycleProcessor,发布ContextRefreshedEvent事件
			finishRefresh();
		}

		catch (BeansException ex) {
			if (logger.isWarnEnabled()) {
				logger.warn("Exception encountered during context initialization - " +
						"cancelling refresh attempt: " + ex);
			}

			// Destroy already created singletons to avoid dangling resources.
			// 销毁已创建的单例对象
			destroyBeans();

			// Reset 'active' flag.
			cancelRefresh(ex);

			// Propagate exception to caller.
			throw ex;
		}

		finally {
			// Reset common introspection caches in Spring's core, since we
			// might not ever need metadata for singleton beans anymore...
			resetCommonCaches();
		}
	}
}

BeanFactory中两个重要的对象

DefaultListableBeanFactory.java

/** Map of bean definition objects, keyed by bean name. */
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

DefaultSingletonBeanRegistry.java

/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

Debug源码分析

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析,Spring,mr,spring,java
Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析,Spring,mr,spring,java

register(componentClasses):注册指定的配置类SpringConfig02到beanDefinitionMap集合中

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析,Spring,mr,spring,java

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析,Spring,mr,spring,java

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析,Spring,mr,spring,java

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析,Spring,mr,spring,java

invokeBeanFactoryPostProcessors(beanFactory):创建BeanFactoryPostProcessor接口相关实现类的实例对象并存入singletonObjects集合中;执行BeanFactoryPostProcessor接口相关实现类的方法,通过ConfigurationClassPostProcessor处理配置类中需要注册的bean对象,并将bean对象注册到beanDefinitionMap集合中。

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析,Spring,mr,spring,java

registerBeanPostProcessors(beanFactory):注册BeanPostProcessor接口相关实现类,创建BeanPostProcessor接口相关实现类的实例对象并存入singletonObjects集合中

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析,Spring,mr,spring,java
Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析,Spring,mr,spring,java

finishBeanFactoryInitialization(beanFactory):实例化、初始化剩下的非懒加载的单例对象并存入singletonObjects集合中

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析,Spring,mr,spring,java

beanFactory.preInstantiateSingletons():提前加载单例对象文章来源地址https://www.toymoban.com/news/detail-648402.html


到了这里,关于Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Mr. Cappuccino的第59杯咖啡——简单手写SpringIOC框架

    基于XML方式 项目结构 项目代码 pom.xml UserBean.java spring.xml SpringTest01.java 运行结果 基于注解方式 项目结构 项目代码 ScanBean.java SpringConfig.java SpringTest02.java 运行结果 核心原理 底层使用map集合管理对象,key=beanId,value=实例对象 基于XML方式 原理 基于反射+工厂模式+DOM技术 使用

    2024年02月13日
    浏览(28)
  • Mr. Cappuccino的第69杯咖啡——Oracle之存储过程

    概念 PLSQL是Oracle对sql语言的过程化扩展,指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。 程序结构 PL/SQL可以分为三个部分:声明部分、可执行部分、异常处理部分。 其中DECLARE部分用来声明变量或游标(结果集类型变量),如果程序

    2024年01月17日
    浏览(34)
  • Mr. Cappuccino的第55杯咖啡——Mybatis一级缓存&二级缓存

    缓存越小,查询速度越快,缓存数据越少 缓存越大,查询速度越慢,缓存数据越多 在多级缓存中,一般常见的是先查询一级缓存,再查询二级缓存,但在Mybatis中是先查询二级缓存,再查询一级缓存。 在Mybatis中,BaseExecutor属于一级缓存执行器,CachingExecutor属于二级缓存执行

    2024年02月14日
    浏览(32)
  • Mr. Cappuccino的第57杯咖啡——简单手写Mybatis大致原理

    底层基于JDK动态代理技术实现 pom.xml config.properties UserEntity.java UserMapper.java Insert.java JdbcUtils.java MapperProxy.java SqlSession.java MybatisTest.java 运行MybatisTest类 SqlSession.java MapperProxy.java MybatisTest.java MapperProxy.java MybatisTest.java 运行结果

    2024年02月14日
    浏览(54)
  • Mr. Cappuccino的第68杯咖啡——基于Docker安装Oracle11g

    拉取镜像 以持久化的方式启动容器 关于持久化,source=oracle_vol指的是容器中的数据卷路径,target指的是容器外需要被挂载的目录路径。 查看volume的具体位置 修改配置文件 使用I键进入编辑模式,添加以下配置信息,再使用Esc键退出编辑模式,输入:wq保存配置信息。 检查配置

    2024年01月17日
    浏览(41)
  • Mr. Cappuccino的第58杯咖啡——MacOS配置Maven和Java环境

    如果使用的是bash,则使用以下命令 因为我这里使用的是zsh,所以使用以下命令 下载Maven Maven下载地址 配置前准备 使用command+shift+G进入/usr/local/目录 创建maven文件夹 将下载好的Maven压缩包解压 把解压后的文件复制到maven文件夹下面,并创建repo文件夹用来存放拉取的maven依赖

    2024年02月14日
    浏览(32)
  • 【Spring源码解读一】IoC容器之AnnotationConfigApplicationContext

    AnnotationConfigApplicationContext构造方法 this() AnnotatedBeanDefinitionReader ClassPathBeanDefinitionScanner register(componentClasses)         根据AnnotationConfigApplicationContext类去阅读其将Bean对象交给IoC容器管理的过程。以下这三个代码块是将配置类注册进IoC容器的例子。下面是关于这个类的继承与

    2024年02月08日
    浏览(32)
  • 从零开始 Spring Boot 63:Hibernate 继承映射

    图源:简书 (jianshu.com) 关系型数据库设计中是不存在继承概念的,但实体类可以用继承来组织代码结构,所以需要用一种方式将实体类的继承结构映射到表结构。 本文将介绍几种在 JPA(Hibernate)中映射实体类继承层次的方式。 第一种方式是用 @MappedSuperclass 标记超类(Super

    2024年02月12日
    浏览(36)
  • spring注解报错Unsupported class file major version 63

    学习尚硅谷的spring中的基于注解管理bean时,运行程序测试时报错“Unsupported class file major version 63” 运行测试的时候报错“Unsupported class file major version 63” 报错内容 JDK版本太高了,更换JDK版本即可解决。 第一步,打开settings 第二步,将jdk版本更换为低版本,点击应用apply。

    2024年02月12日
    浏览(38)
  • Spring Boot进阶(63):「超详细」利用 Redis 实现高效延时队列:踩坑、优化、实践

            提到延时队列,相信各位同学并不会陌生,JDK原生提供了延时队列的使用,当然我们这里介绍的不是这种;在实际的项目中,如果我们有延时队列的场景,可以怎样去实现呢?举一个常见的例子,比如淘宝下单30分钟内,若没有支付,则自动取消订单,这该如何实现

    2024年02月07日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包