Spring容器创建源码解析

【Codesys】-扫描添加失败,手动添加第三方模块,真·DC模式的高速计数模块 欧姆龙耦合器(NX-ECC201)和高速计数模块(NX-EC0132)单独使用。扫描设备添加到Codesys中,会报错,无法自动添加。记录一下,以防忘记。高速的计数保证了位置的准确性,位置准确就能保证裁切的精度,一切的基础就在这儿了,奈何目前只有欧姆龙和倍福能做到这样的波形。 阅读详情

public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
	this();
	register(annotatedClasses);
	// 创建刷新
	refresh();
}

AbstractApplicationContext:

@Override
public void refresh() throws BeansException, IllegalStateException {
	synchronized (this.startupShutdownMonitor) {
		// 1. 初始化前的预处理
		prepareRefresh();
		// 2. 获取BeanFactory,加载所有bean的定义信息(未实例化)
		ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
		// 3. BeanFactory的预处理配置
		prepareBeanFactory(beanFactory);
		try {
			// 4. BeanFactory准备工作完成后进行的后置处理工作
			// 子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置
			postProcessBeanFactory(beanFactory);
			// 5. 执行BeanFactory创建后的后置处理器(BeanFactoryPostProcessor)方法
			invokeBeanFactoryPostProcessors(beanFactory);
			// 6. 注册Bean的后置处理器
			registerBeanPostProcessors(beanFactory);
			// 7. 初始化MessageSource
			initMessageSource();
			// 8. 初始化事件派发器
			initApplicationEventMulticaster();
			// 9. 子类重写这个方法,在容器刷新的时候可以自定义逻辑
			onRefresh();
			// 10. 将所有项目里面的ApplicationListener注册进来
			registerListeners();
			
			// 到此为止,BeanFactory已创建完成

			// 11. 初始化所有剩下的单实例bean
			finishBeanFactoryInitialization(beanFactory);
			// 12. 完成BeanFactory的初始化创建工作;IOC容器就创建完成;
			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...
			// 13. 清除缓存
			resetCommonCaches();
		}
	}
}

BeanFactory预准备

Spring容器的refresh()【创建刷新】;
  1、prepareRefresh()刷新前的预处理;
  1)、initPropertySources()初始化一些属性设置;子类自定义个性化的属性设置方法;
  2)、getEnvironment().validateRequiredProperties();检验属性的合法等
  3)、earlyApplicationEvents= new LinkedHashSet();保存容器中的一些早期的事件;
  2、obtainFreshBeanFactory();获取BeanFactory;
   1)、refreshBeanFactory();刷新【创建】BeanFactory;
    创建了一个this.beanFactory = new DefaultListableBeanFactory();
    设置id;
  2)、getBeanFactory();返回刚才GenericApplicationContext创建的BeanFactory对象;
  3)、将创建的BeanFactory【DefaultListableBeanFactory】返回;
 3、prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置);
  1)、设置BeanFactory的类加载器、支持表达式解析器…
  2)、添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
  3)、设置忽略的自动装配的接口EnvironmentAware、EmbeddedValueResolverAware、xxx;
  4)、注册可以解析的自动装配;我们能直接在任何组件中自动注入:
    BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
  5)、添加BeanPostProcessor【ApplicationListenerDetector】
  6)、添加编译时的AspectJ;
  7)、给BeanFactory中注册一些能用的组件;
    environment【ConfigurableEnvironment】、
    systemProperties【Map<String, Object>】、
    systemEnvironment【Map<String, Object>】
 4、postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作;
     1)、子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置

prepareRefresh()刷新前的预处理:
 1)、initPropertySources()初始化一些属性设置;子类自定义个性化的属性设置方法;
 2)、getEnvironment().validateRequiredProperties();检验属性的合法等
 3)、earlyApplicationEvents= new LinkedHashSet();保存容器中的一些早期的事件;

protected void prepareRefresh() {
	this.startupDate = System.currentTimeMillis();
	this.closed.set(false);
	this.active.set(true);

	if (logger.isInfoEnabled()) {
		logger.info("Refreshing " + this);
	}

	// 初始化一些属性设置;子类自定义个性化的属性设置方法
	initPropertySources();
	// 检验属性的合法等
	getEnvironment().validateRequiredProperties();
	// 保存容器中的一些早期的事件
	this.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();
}

obtainFreshBeanFactory();获取BeanFactory:
 1)、refreshBeanFactory();刷新【创建】BeanFactory;
  创建了一个this.beanFactory = new DefaultListableBeanFactory();
  设置id;
 2)、getBeanFactory();返回刚才GenericApplicationContext创建的BeanFactory对象;
 3)、将创建的BeanFactory【DefaultListableBeanFactory】返回;

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
	// 刷新【创建】BeanFactory
	refreshBeanFactory();
	// 获取上面GenericApplicationContext创建的BeanFactory对象
	ConfigurableListableBeanFactory beanFactory = getBeanFactory();
	if (logger.isDebugEnabled()) {
		logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
	}
	// 将创建的BeanFactory【DefaultListableBeanFactory】返回
	return beanFactory;
}

执行BeanFactoryPostProcessor

5、invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的方法;
BeanFactoryPostProcessor:BeanFactory的后置处理器。在BeanFactory标准初始化之后执行的;
两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
1)、执行BeanFactoryPostProcessor的方法;
  先执行BeanDefinitionRegistryPostProcessor
   1)、获取所有的BeanDefinitionRegistryPostProcessor;
   2)、看先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor、
    postProcessor.postProcessBeanDefinitionRegistry(registry)
   3)、在执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor;
    postProcessor.postProcessBeanDefinitionRegistry(registry)
   4)、最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors;
    postProcessor.postProcessBeanDefinitionRegistry(registry)
  再执行BeanFactoryPostProcessor的方法
   1)、获取所有的BeanFactoryPostProcessor
   2)、看先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor、
    postProcessor.postProcessBeanFactory()
   3)、在执行实现了Ordered顺序接口的BeanFactoryPostProcessor;
    postProcessor.postProcessBeanFactory()
   4)、最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor;
    postProcessor.postProcessBeanFactory()

6、registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器)【 intercept bean creation】
 不同接口类型的BeanPostProcessor;在Bean创建前后的执行时机是不一样的
 BeanPostProcessor、
 DestructionAwareBeanPostProcessor、
 InstantiationAwareBeanPostProcessor、
 SmartInstantiationAwareBeanPostProcessor、
 MergedBeanDefinitionPostProcessor【internalPostProcessors】、  
  1)、获取所有的 BeanPostProcessor;后置处理器都默认可以通过PriorityOrdered、Ordered接口来执行优先级
  2)、先注册PriorityOrdered优先级接口的BeanPostProcessor;
   把每一个BeanPostProcessor;添加到BeanFactory中
   beanFactory.addBeanPostProcessor(postProcessor);
  3)、再注册Ordered接口的
  4)、最后注册没有实现任何优先级接口的
  5)、最终注册MergedBeanDefinitionPostProcessor;
  6)、注册一个ApplicationListenerDetector;来在Bean创建完成后检查是否是ApplicationListener,如果是 applicationContext.addApplicationListener((ApplicationListener<?>) bean);
  
7、initMessageSource();初始化MessageSource组件(做国际化功能;消息绑定,消息解析);
 1)、获取BeanFactory
 2)、看容器中是否有id为messageSource的,类型是MessageSource的组件
  如果有赋值给messageSource,如果没有自己创建一个DelegatingMessageSource;
  MessageSource:取出国际化配置文件中的某个key的值;能按照区域信息获取;
 3)、把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
MessageSource.getMessage(String code, Object[] args, String defaultMessage, Locale locale);

8、initApplicationEventMulticaster();初始化事件派发器;
1)、获取BeanFactory
2)、从BeanFactory中获取applicationEventMulticaster的ApplicationEventMulticaster;
3)、如果上一步没有配置;创建一个SimpleApplicationEventMulticaster
4)、将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接自动注入

9、onRefresh();留给子容器(子类)
 1、子类重写这个方法,在容器刷新的时候可以自定义逻辑;

10、registerListeners();给容器中将所有项目里面的ApplicationListener注册进来;
 1、从容器中拿到所有的ApplicationListener
 2、将每个监听器添加到事件派发器中;
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
 3、派发之前步骤产生的事件;

初始化所有剩下的单实例Bean

11、finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean;
 1、beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean
  1)、获取容器中的所有Bean,依次进行初始化和创建对象
  2)、获取Bean的定义信息;RootBeanDefinition
  3)、Bean不是抽象的,是单实例的,是懒加载;
   1)、判断是否是FactoryBean;是否是实现FactoryBean接口的Bean;
   2)、不是工厂Bean。利用getBean(beanName);创建对象
    0、getBean(beanName); ioc.getBean();
    1、doGetBean(name, null, null, false);
    2、先获取缓存中保存的单实例Bean。如果能获取到说明这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来)
     从private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);获取的
    3、缓存中获取不到,开始Bean的创建对象流程;
    4、标记当前bean已经被创建
    5、获取Bean的定义信息;
    6、【获取当前Bean依赖的其他Bean;如果有按照getBean()把依赖的Bean先创建出来;】
    7、启动单实例Bean的创建流程;
     1)、createBean(beanName, mbd, args);
     2)、Object bean = resolveBeforeInstantiation(beanName, mbdToUse);让BeanPostProcessor先拦截返回代理对象;
      【InstantiationAwareBeanPostProcessor】:提前执行;
先触发:postProcessBeforeInstantiation();
    如果有返回值:触发postProcessAfterInitialization();
     3)、如果前面的InstantiationAwareBeanPostProcessor没有返回代理对象;调用4)
     4)、Object beanInstance = doCreateBean(beanName, mbdToUse, args);创建Bean
      1)、【创建Bean实例】;createBeanInstance(beanName, mbd, args);
利用工厂方法或者对象的构造器创建出Bean实例;
      2)、applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName);
      3)、【Bean属性赋值】populateBean(beanName, mbd, instanceWrapper);
赋值之前:
       1)、拿到InstantiationAwareBeanPostProcessor后置处理器;
postProcessAfterInstantiation();
       2)、拿到InstantiationAwareBeanPostProcessor后置处理器;
postProcessPropertyValues();
===赋值之前:=
       3)、应用Bean属性的值;为属性利用setter方法等进行赋值;
applyPropertyValues(beanName, mbd, bw, pvs);
       4)、【Bean初始化】initializeBean(beanName, exposedObject, mbd);
1)、【执行Aware接口方法】invokeAwareMethods(beanName, bean);执行xxxAware接口的方法
BeanNameAware\BeanClassLoaderAware\BeanFactoryAware
2)、【执行后置处理器初始化之前】applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
BeanPostProcessor.postProcessBeforeInitialization();
3)、【执行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);
1)、是否是InitializingBean接口的实现;执行接口规定的初始化;
2)、是否自定义初始化方法;
4)、【执行后置处理器初始化之后】applyBeanPostProcessorsAfterInitialization
BeanPostProcessor.postProcessAfterInitialization();
5)、注册Bean的销毁方法;
5)、将创建的Bean添加到缓存中singletonObjects;
ioc容器就是这些Map;很多的Map里面保存了单实例Bean,环境信息。。。。;
所有Bean都利用getBean创建完成以后;
检查所有的Bean是否是SmartInitializingSingleton接口的;如果是;就执行afterSingletonsInstantiated();
12、finishRefresh();完成BeanFactory的初始化创建工作;IOC容器就创建完成;
1)、initLifecycleProcessor();初始化和生命周期有关的后置处理器;LifecycleProcessor
默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor();
加入到容器;

		写一个LifecycleProcessor的实现类,可以在BeanFactory
			void onRefresh();
			void onClose();	
	2)、	getLifecycleProcessor().onRefresh();
		拿到前面定义的生命周期处理器(BeanFactory);回调onRefresh();
	3)、publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件;
	4)、liveBeansView.registerApplicationContext(this);

======总结===========
1)、Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;
	1)、xml注册bean;<bean>
	2)、注解注册Bean;@Service、@Component、@Bean、xxx
2)、Spring容器会合适的时机创建这些Bean
	1)、用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;
	2)、统一创建剩下所有的bean的时候;finishBeanFactoryInitialization();
3)、后置处理器;BeanPostProcessor
	1)、每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;
		AutowiredAnnotationBeanPostProcessor:处理自动注入
		AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;
		xxx....
		增强的功能注解:
		AsyncAnnotationBeanPostProcessor
		....
4)、事件驱动模型;
	ApplicationListener;事件监听;
	ApplicationEventMulticaster;事件派发:
PostgreSQL:Patroni 高可用架构,基于etcd的自动故障转移集群 本文详细介绍了基于Patroni和etcd构建PostgreSQL高可用集群的方案。Patroni作为外部守护进程,通过etcd分布式协调服务实现自动故障转移、主节点选举等关键功能,弥补了PostgreSQL原生缺乏自动故障转移的不足。文章涵盖核心架构(3节点PG+3节点etcd)、环境规划、etcd集群部署(包括配置验证)以及Patroni安装配置的关键步骤,特别强调了Patroni自动初始化PG实例、配置同步复制等生产级特性。该方案通过外部组件协同工作,在不修改PG源码的情况下实现了生产环境所需的高可用 阅读详情

相关推荐

手把手教你用RSoft BPM仿真一个1x2光分束器:从参数设置到结果分析全记录

本文详细介绍了使用RSoft BPM模块设计和仿真1×2光分束器的完整流程,包括参数设置、结构建模、仿真配置和结果分析。通过实战指南,帮助读者掌握光波导器件的仿真技术,实现50:50功率分配的设计目标,适用于光通信和集成光学领域的研究与应用。

weixin_30545945的博客 545

20190514面试SPRING扩展机制

1.SPRING扩展机制 通过基于XML和基于Java的配置扩展,可以使用户通过Spring使用我们研发的组件,提供很好的易用性。 通过Spring容器最常用的两个扩展点:BeanFactoryPostProcessor和BeanPostProcessor,可以使我们的程序逻辑和Spring容器紧密合作,无缝插入到用户bean的生命周期中,发挥更强大的作用。 2.spring的扩展接口 1....

hhcccchh的专栏 675

数据分析面试八股文--技能软件类

数据分析的“三板斧"指的是三个在 Python 数据分析领域广泛使用的库:NumPy,Pandas,和 Matplotlib。这三个库提供了处理和分析数据的强大工具。NumPyNumPy(Numerical Python)是一个开源 Python 库,用于支持大型多维数组和矩阵运算。此外,NumPy 还提供了大量的数学函数来操作这些数组。np.array():创建数组np.arange():返回一个有终点和起点的固定步长的排列。

zfyzfw的博客 4377

Spring中11个最常用的扩展点

前言 最近越来越多的读者认可我的文章,还是件挺让人高兴的事情。有些读者私信我说希望后面多分享spring方面的文章,这样能够在实际工作中派上用场。正好我对spring源码有过一定的研究,并结合我这几年实际的工作经验,把spring中我认为不错的知识点总结一下,希望对您有所帮助。 一 如何获取spring容器对象 1.实现BeanFactoryAware接口 @Service public class PersonService implements BeanFactoryAware { p

meser88的博客 1502

别再模拟IIC了!用STM32F103C8T6的硬件IIC驱动AT24C64,CubeMX配置+避坑指南

本文详细介绍了如何使用STM32F103C8T6的硬件IIC驱动AT24C64 EEPROM,通过CubeMX配置和HAL库函数解析,提供从模拟IIC到硬件IIC的完整解决方案。内容包括硬件IIC与模拟IIC的核心差异、CubeMX工程配置详解、HAL库驱动实战以及典型问题诊断与优化,帮助开发者构建更稳定高效的存储系统。

weixin_27038245的博客 188

当AI学会写“自传”:OpenClaw 的 SOUL.md 如何把配置文件变成一颗会变形的心

SOUL.md。

步子哥的博客 1309

Spring框架的扩展点

实现自定义继承:这个类提供了接口的默认实现,你可以覆盖必要的方法来实现自定义逻辑。重写方法:这是最关键的方法,用于将输入的字符串转换成相应的对象。重写方法:这个方法应返回一个可以表示内部属性值的字符串,通常用于UI显示或调试。在Spring配置中注册自定义可以通过几种方式实现,最常见的是在配置类中使用@BeanMap<Class<?>, Class<?通过上述方式,当Spring框架遇到需要将字符串转换为类型的属性时,会使用你定义的来进行转换。

www_tlj的专栏 1179

不会路由器叠加多条宽带?看这个就够了,能让你的局域网速度更快!

通常我们在企业网络或实际项目中,随着用户的增加,一条或者几条带宽不能满足正常使用,便可以对带宽进行叠加,便于网络带度更快;通常家里有可能有两条带宽的,联通或移动的,可能都是充话费送的,但网速都不怎么样,不用可惜,用之委屈,那怎么办呢?如在迅雷上开启下载,多个资源同时下载,此时总带宽可以达到120M,也就是WAN口带宽可以叠加。多wan口路由器, 一般是有2个wan口,分别为wan1与wan2。当然也有更多的wan口的。[1] 对整个局域网来说,出口带宽数量多了,相当于总带宽上升,这样是可以起到叠加效果。

qq_43416206的博客 1112

Spring中最常用的11个扩展点

我们一说到spring,可能第一个想到的是IOC控制反转) 和AOP(面向切面编程)。没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架中脱颖而出。除此之外,我们在使用spring的过程中,有没有发现它的扩展能力非常强。由于这个优势的存在,让spring拥有强大的包容能力,让很多第三方应用能够轻松投入spring的怀抱。比如:rocketmq、mybatis、redis等。今天跟大家一起聊聊,在Spring中最常用的11个扩展点。

m0_69632475的博客 3287

华为OD机试 C++【TLV解析】

这里的valueOffset指的是value在整串消息里的起始位置(从0开始数)。这表示tag是15(十六进制的0F),length是4,接着的8个字符是value的内容。你收到了一串由两端设备传递的TLV格式的消息,现在你需要根据这串消息生成一个对应的(tag, length, valueOffset)列表。tag是15,对应的数据长度为4,value从第3个字节开始,所以偏移量为2。第二行:一个数字n,表示我们给出的tag的数量(0 < n < 1000)。第一行:一串消息,长度不超过10000。

wtswts1232的博客 482

logisim中,如何设计一个位于十字路口的交通信号灯控制系统?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1345

【Spring Boot】扩展机制详解 ,三分钟带你搞懂SpringBoot的扩展机制

创建 Starter 模块:定义,引入功能模块依赖(如))。编写自动配置类@Bean.build();注册配置类:在中添加:org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.MinioAutoConfiguration定义注解编写切面:@Aspect@Component。

2302_79600390的博客 1476

华为OD机试真题 新系统 - 计算数列位置N的值 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2009

Spring容器的创建过程源码解析

注:调试的Spring版本是4.3.12.RELEASE。 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo.class); 从AnnotationConfigApplicationContext创建开始进入: 类:AnnotationConfig...

huxiutao的博客 272

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

spring容器创建源码解析

refresh() 接下来我们解析AbstractApplicationContext 中的refresh()方法源代码: 一个一个的分析refresh()中调用的各个方法 @Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshi

m0_45097637的博客 436

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

spring ioc容器创建与bean初始化源码解析1:beanFactory容器的创建及初始化

spring容器创建及bean初始化过程 分为6个部分 1.beanFactory容器的创建及初始化 2.在beanFactory容器初始化之后定制和修改BeanFactory内容 3.注册BeanPostProcessor(作用在bean创建的过程中进行拦截,从而执行指定逻辑) 4.初始化MessageSource ApplicationEventMulticaster App...

u013905744的专栏 514

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring源码解析 – AnnotationConfigApplicationContext容器创建过程

Spring源码解析 – AnnotationConfigApplicationContext容器创建过程 Spring在BeanFactory基础上提供了一些列具体容器的实现,其中AnnotationConfigApplicationContext是一个用来管理注解bean的容器,从AnnotationConfigApplicationContext的实现结构图中可以看出: Annotati......

最怕一生碌碌无为,还安慰自己平凡可贵 1万+

Spring源码解析(二):bean容器的创建、注册默认后置处理器、bean定义扫描类

}//创建注解容器,入参为配置类 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config . class);//获取某个bean Book book = context . getBean(Book . class);//关闭容器 context . close();} }调用ClassPathBeanDefinitionScanner的有参构造方法。

从基础到源码解析的学习记录 1883

Spring源码解析,AnnotationConfigApplicationContext容器创建过程

Spring源码解析 – AnnotationConfigApplicationContext容器创建过程 Spirng在BeanFactory基础上提供了一些具体容器的实现,其中AnnotationConfigApplicationContext是一个用来管理注解bean的容器,从AnnotationConfigApplicationContext的实现结构中可以看出: AnnotationCo...

weixin_41385933的博客 387

【spring注解驱动开发】- spring容器创建源码解析

文章目录1 prepareRefresh();刷新前的预处理1.1 initPropertySources();初始化一些属性设置;子类自定义个性化的属性设置方法1.2 getEnvironment().validateRequiredProperties();检验属性的合法性1.3 预处理事件驱动2 obtainFreshBeanFactory();获取BeanFactory 前面学习一些关于s...

suchahaerkang的博客 266

Spring注解驱动开发第49讲——Spring IOC容器创建源码解析(九)之Spring IOC容器创建源码总结

经过前面8讲的学习,我们就阅读了一下Spring IOC容器整个的创建以及初始化过程的源码,在跟踪Spring源码时,整个流程可以说是非常复杂的。因此,在本讲中,我们就来对其做一个小的总结。 首先,我们得需要掌握Spring中的一些核心思想,我们所要掌握的第一个核心思想就是,Spring IOC容器在启动的时候,会先保存所有注册进来的bean的定义信息,将来,BeanFactory就会按照这些bean的定义信息来为我们创建对象。 那么,如何来编写这些bean的定义信息呢?你可以有如下两种方式来编写这些bea

李阿昀的博客 1660

Spring注解驱动开发第46讲——Spring IOC容器创建源码解析(六)之初始化所有剩下的单实例bean(上)

写在前面 在前面几讲中,我们已经对IOC容器创建过程中的大部分方法进行过研究,其中比较核心的方法就是如下两个: invokeBeanFactoryPostProcessors方法:该方法在《Spring注解驱动开发第42讲——Spring容器创建源码解析(二)之执行BeanFactoryPostProcessor》这一讲中已经详细讲过了,要是还有不清楚的同学,可以查阅这篇文章哟! registerBeanPostProcessors方法:该方法在《Spring注解驱动开发第43讲——Spring容器创建源

李阿昀的博客 1866

【Spring注解】Spring容器创建 refresh()源码解析

Spring容器创建过程BeanFactory预准备prepareRefresh()obtainFreshBeanFactory()prepareBeanFactory(beanFactory)postProcessBeanFactory(beanFactory)invokeBeanFactoryPostProcessors 当我们执行这一句就是容器创建的过程 AnnotationConfigApplicationContext applicationContext= new AnnotationConfi

flora 280

Spring注解驱动开发第41讲——Spring IOC容器创建源码解析(一)之BeanFactory的创建以及预准备工作

写在前面 在前面,我们已经学会了怎样来使用ApplicationListener,也研究了一下其内部原理。而从这一讲开始,我们就要结合我们以前学过的所有内容,来梳理一下Spring整个容器的创建以及初始化过程。我是希望通过对Spring源码的整个分析,令大家对Spring内部的工作原理以及运行机制能有一个更深刻的理解。 接下来,我们来分析并详细记录一下Spring容器的创建以及初始化过程。 BeanFactory的创建以及预准备工作 我们先来看一下如下的一个单元测试类(例如IOCTest_Ext)。 pac

李阿昀的博客 2790

Spring中IOC容器的整体创建过程(源码解析)

Spring中IOC容器的整体创建过程(源码解析)内容一、Spring创建IOC容器源码解析配置二、IOC容器创建整体流程三、IOC容器创建流程分步解由于此处源码过多,只给出大体过程,不会贴上源码,有需要的可以自行进行debug作为参照2.读入数据总结 内容 记录下Spring的整体运行流程 一、Spring创建IOC容器源码解析配置 1.要了解Spring的源码运行流程,先从总体框架入手,并且加上debug调试完成 2.定义一个配置文件类,再加上一个测试类,然后debug启动,所有开发都在id

Simpier的博客 925

spring ioc容器创建与bean初始化源码解析总结

1. Spring容器在启动的时候,会保存所有注册进来的Bean的定义信息; 1.1 xml注册bean;<bean> 1.2 注解注册Bean;@Service、@Component、@Bean、xxx 2. Spring容器会在合适的时机创建这些Bean 2.1 用到这个bean的时候,如要先用到后置处理器这些Bean的时候,利用getBean创建bean;创建好以后...

u013905744的专栏 350
上一篇: Java开发 之分割List、获取两个List中不同的元素
下一篇: IDEA 之解决快捷键突然失效问题
yyangqqian
博客等级 码龄15年 406粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值