1.ioc是码调什么意思
2.Spring源码- 02 Spring IoC容器启动之refresh方法
3.è¯·ä½ è°è°å¯¹springçç解?
4.Spring注解驱动开发二狗子让我给他讲讲@EnableAspectJAutoProxy注解
5.IOCåAOPçåºå«ï¼
6.Spring IoC源码深度剖析
ioc是什么意思
IOC是控制反转的缩写。详细解释如下:
一、码调IOC的码调基本含义
IOC作为控制反转的缩写,是码调软件工程中一个重要的概念。在面向对象编程中,码调IOC思想强调的码调有赞客源码是将传统程序中由代码直接控制的流程,转变为通过配置文件或外部服务来控制,码调从而使得应用程序的码调配置和依赖性规范与实际的应用程序代码分开。这样,码调当应用需要进行变更或调整时,码调只需要更改配置文件,码调而无需更改实际的码调应用程序代码。IOC大大增强了软件系统的码调可维护性和灵活性。
二、码调IOC的码调重要性
在传统的程序设计中,程序的流程通常由程序本身的代码控制。而随着软件系统的复杂性和规模的扩大,这种方式的缺点逐渐显现。一旦系统需要改变流程,就意味着需要修改源代码,这不仅增加了维护的难度,也降低了系统的源码通信灵活性。而IOC的出现解决了这一问题,它通过将程序的依赖关系外部化,使得程序流程的控制权发生了反转。这样,程序就可以更加专注于自身的业务逻辑,而无需关心依赖关系的创建和管理。
三、IOC的应用场景
IOC在软件系统中有着广泛的应用场景。特别是在依赖注入技术中,IOC的思想得到了充分的体现。在依赖注入技术中,对象的创建和对象间的相互调用关系被外部化,并由IOC容器来管理。通过这种方式,开发者可以更加专注于业务逻辑的实现,而无需关心对象的创建和配置细节。这种解耦的设计方式大大提高了软件系统的可维护性和可扩展性。
综上所述,IOC作为控制反转的缩写,在软件工程中具有重要意义。它通过改变程序流程的root 源码控制方式,使得软件系统的配置和依赖关系与实际的应用程序代码分开,从而提高了软件系统的可维护性和灵活性。
Spring源码- Spring IoC容器启动之refresh方法
在注册阶段,AnnotationConfigApplicationContext构造方法中的第一个方法被分析过。接下来,我们关注第二个方法:register(componentClasses)。在使用XML配置方式时,通过new ClassPathXmlApplicationContext("classpath:spring.xml")来创建实例,其中需要指定xml配置文件路径。使用注解方式时,也需要为ApplicationContext提供起始配置源头,这里使用配置类代替xml配置文件,按照配置类中的注解(如@ComponentScan、@Import、@Bean)解析并注入Bean到IoC容器。
通过配置类,Spring解析注解实现Bean的注入。使用@Configuration注解定义的配置类相当于xml配置文件,但目前Spring推荐使用注解方式,xml配置的使用概率正在降低。
register(componentClasses)方法的Xsteritp源码核心逻辑在AnnotatedBeanDefinitionReader#doRegisterBean中,将传入的配置类解析为BeanDefinition并注册到IoC容器。ConfigurationClassPostProcessor这个BeanFactory后置处理器在IoC初始化时,获取配置类的BeanDefinition集合,开始解析。
真正启动IoC容器的流程在refresh()方法中,这是了解IoC容器启动流程的关键步骤。refresh方法在AbstractApplicationContext中定义,采用模板模式,提供IoC初始化流程的基本实现,子类可以扩展。
下面分析refresh()方法的每个步骤,以了解IoC容器的启动流程。
prepareRefresh方法主要在refresh执行前进行准备工作,如设置Context的启动时间、状态,以及扩展系统属性相关。
initPropertySources()方法主要用于扩展配置来源,如网络、物理文件、数据库等加载配置信息。StandardEnvironment默认只提供加载系统变量和应用变量的lengoo 源码功能,用于子类扩展。
❝initPropertySources方法常见扩展场景包括:❞
getEnvironment().validateRequiredProperties()确保设置的必要属性在环境中存在,否则抛出异常终止应用。
BeanFactory是Spring的基本IoC容器,ApplicationContext包装了BeanFactory,提供更智能、更便捷的功能。ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();获取的BeanFactory是IoC容器初始化工作的基础。
上面获取的BeanFactory还不能直接使用,需要填充必要的配置信息。至此,IoC容器的启动流程基本完成。
这里对IoC启动流程有个大致、直观的印象。主要步骤包括:准备阶段、配置来源扩展、初始化BeanFactory、填充配置、解析配置类、注册Bean、实例化BeanPostProcessor、初始化国际化和事件机制、以及创建内嵌Servlet容器(在SpringBoot中实现)。这些步骤确保了IoC容器顺利启动并管理Bean。
è¯·ä½ è°è°å¯¹springçç解?
1.解éspringçioc? å ç§æ³¨å ¥ä¾èµçæ¹å¼ï¼springçä¼ç¹ï¼
IOCä½ å°±è®¤ä¸ºä»æ¯ä¸ä¸ªç产å管çbeanç容å¨å°±è¡äºï¼åæ¥éè¦å¨è°ç¨ç±»ä¸newçä¸è¥¿ï¼ç°å¨é½æ¯æè¿ä¸ªIOC容å¨è¿è¡äº§çï¼å
æ¶ï¼è¦æ¯äº§ççæ¯åä¾çbeanï¼ä»è¿å¯ä»¥ç»ç®¡çbeanççå½å¨æï¼
springçIOCæä¸ç§æ³¨å ¥æ¹å¼ ï¼
第ä¸æ¯æ ¹æ®å±æ§æ³¨å ¥ ä¹å«setæ¹æ³æ³¨å ¥ï¼
第äºç§æ¯æ ¹æ®æé æ¹æ³è¿è¡æ³¨å ¥ï¼
第ä¸ç§æ¯æ ¹æ®æ³¨è§£è¿è¡æ³¨å ¥ï¼è¿ç§æ¹å¼æ认为æ¯è¾å¥½ï¼æ¹ä¾¿ï¼è¦æ¯beanå¤çè¯ï¼ä½¿ç¨å两ç§æ¹å¼ä¼ä½¿å¾é ç½®æ件è¿äºèè¿ã
Springçä¼ç¹ï¼ä¸»è¦æ¯æ ¹æ®å®çIOCåAOPä½ç°çãææè§ä»å°±æ¯ææ们以åç¨å°çå·¥å模å¼å代ç模å¼è¿è¡äºä¸ä¸ªå°è£ ã
IOC主è¦æ¯è§£å³äºä»£ç çè¦åæ§é®é¢ï¼èAOPæ¯é¢ååé¢ç¼ç¨çæ好解éï¼
2.解éSpringä¸IOC, DI, AOP
iocå°±æ¯æ§å¶ç¿»è½¬ææ¯ä¾èµæ³¨å ¥ãéä¿ç讲就æ¯å¦æå¨ä»ä¹å°æ¹éè¦ä¸ä¸ªå¯¹è±¡ï¼ä½ èªå·±ä¸ç¨å»éè¿new çæä½ éè¦ç对象ï¼
èæ¯éè¿springçbeanå·¥åä¸ºä½ é¿çè¿æ ·ä¸ä¸ªå¯¹è±¡ã
aopå°±æ¯é¢ååé¢çç¼ç¨ãæ¯å¦è¯´ä½ æ¯åä¸æ¬¡å¯¹æ°æ®åºæä½ï¼é½è¦çæä¸å¥æ¥å¿ãå¦æï¼ä½ 对æ°æ®åºçæä½æå¾å¤ç±»ï¼
é£ä½ æ¯ä¸ç±»ä¸é½è¦åå ³äºæ¥å¿çæ¹æ³ãä½æ¯å¦æä½ ç¨aopï¼é£ä¹ä½ å¯ä»¥åä¸ä¸ªæ¹æ³ï¼å¨è¿ä¸ªæ¹æ³ä¸æå ³äºæ°æ®åºæä½çæ¹æ³ï¼
æ¯ä¸æ¬¡è°ç¨è¿ä¸ªæ¹æ³çæ¶åï¼å°±å ä¸çææ¥å¿çæä½ã
3.springçioc/aop/代ç
iocæ¯æ§å¶å转ï¼æ¯springçæ ¸å¿ææ³ãéè¿é¢åæ¥å£ç¼ç¨æ¥å®ç°å¯¹ä¸å¡ç»ä»¶çå¨æä¾èµã aopæ¯é¢å
åé¢ç¼ç¨ï¼å®å¹¶ä¸æ¯åªå¨springæè javaä¸ææçï¼å®åé¢å对象ç¼ç¨ï¼oopï¼æ¯ç¸å¯¹èè¨çå¦ä¸ç§ç¼ç¨ææ³ã
springå¨å®ç°aopç¼ç¨æ¶å©ç¨çæ¯javaç代çæºå¶ã 个人è§å¾java代çæºå¶ççæ¯å¾ç¥å¥ãæ ¸å¿å 容并ä¸å¤
4.springçiocæ¯è§£è¦,aopæ¯å¹²ä»ä¹ç
AOPé¢ååé¢ç¼ç¨ å°ç¨åºä¸ç交åä¸å¡é»è¾ï¼æ¯å¦å®å ¨ï¼æ¥å¿ï¼äºå¡çï¼ï¼å°è£ æä¸ä¸ªåé¢ï¼ç¶åæ³¨å ¥å°ç®æ 对象ï¼å ·ä½ä¸å¡é»è¾ï¼ä¸å»ã
æ¯å¦ï¼ å¾å¤æ¹æ³å¯è½ä¼æå¼å¸¸ï¼ä½ è¦è®°å½è¿ä¸ªå¼å¸¸å°æ¥å¿ä¸å»ï¼å¯ä»¥å个æ¦æªå¨ç±»ï¼å¨è¿ä¸ªç±»ä¸è®°å½æ¥å¿ï¼
å¨spring.xmlä¸é ç½®ä¸ä¸ªå¯¹è¿äºè¦è®°å½æ¥å¿çæ¹æ³çaopæ¦æªå¨ å¨è¿ä¸ªæ¹æ³æ§è¡åè°ç¨è¿ä¸ªæ¦æªå¨ï¼è®°å½æ¥å¿ã
è¿æ ·å°±ä¸ç¨æ¯æ¬¡æå¼å¸¸é½è¦æå¨è®°å½æ¥å¿ã springçäºå¡ç®¡çç¨å°çå°±æ¯aop è¿æ ·ä¹å¯ä»¥æé«ç¨åºçå èæ§ã
5.讲解ä¸ä¸Javaä¸Springä¸IOCåAOP
IoCï¼è¯´ç´ç½ç¹ï¼å°±æ¯éè¿é ç½®æ件ï¼XMLæ.propertiesï¼æå®éè¦å®ä¾åçJAVAç±»ï¼ç±»åçå®æ´å符串ï¼ï¼
å æ¬è¯¥JAVAç±»çä¸ç»åå§åå¼ï¼ç¶åæ们å¨ä»£ç ä¸å 载该é ç½®æ件ï¼ç¶åéè¿ .getBean() å½æ°å°±å¯ä»¥å¾å°ä¸ä¸ªè¯¥JAVAç±»ç对象ï¼
并ä¸è¯¥å¯¹è±¡å·²ç»æ ¹æ®é ç½®æ件ä¸æå®çå±æ§å¼è¿è¡äºåå§åã
AOPï¼è¿ä¸ªæ¯IoCæ´ç®åï¼ç´ç½ç¹è¯´å°±æ¯å®ç°è°ç¨æ个æ¹æ³ä¹åæ/åä¹åï¼èªå¨æ§è¡ä¸ç³»åèªå®ä¹çè¯å¥
6.ç®è¿°Springæ¡æ¶ä¸IOCåAOP
IOCï¼æ§å¶å转ï¼æ¯ä¸ç§è®¾è®¡æ¨¡å¼ãä¸å±å«ä¹æ¯æ§å¶æç转移ï¼ç±ä¼ ç»çå¨ç¨åºä¸æ§å¶ä¾èµè½¬ç§»å°ç±å®¹å¨æ¥æ§å¶ï¼
第äºå±æ¯ä¾èµæ³¨å ¥ï¼å°ç¸äºä¾èµç对象å离ï¼å¨springé ç½®æ件ä¸æè¿°ä»ä»¬çä¾èµå ³ç³»ãä»ä»¬çä¾èµå ³ç³»åªå¨ä½¿ç¨çæ¶åæ建ç«ã
AOPï¼é¢ååé¢ï¼æ¯ä¸ç§ç¼ç¨ææ³ï¼OOPç延ç»ãå°ç³»ç»ä¸éæ ¸å¿çä¸å¡æååºæ¥ï¼è¿è¡åç¬å¤çãæ¯å¦äºå¡ãæ¥å¿åå®å ¨çã
Spring çAOPåIOCé½æ¯ä¸ºäºè§£å³ç³»ç»ä»£ç è¦å度è¿é«çé®é¢ã使代ç éç¨åº¦é«ãæäºç»´æ¤ã
ä¸è¿AOPåIOC并ä¸æ¯springä¸ç¹æçï¼åªæ¯springæä»ä»¬åºç¨çæ´çµæ´»æ¹ä¾¿ ã
Spring注解驱动开发二狗子让我给他讲讲@EnableAspectJAutoProxy注解
在配置类上添加@EnableAspectJAutoProxy注解,能够开启注解版的AOP功能。这意味着,如果在AOP中要启用注解版的AOP功能,就需要在配置类上添加@EnableAspectJAutoProxy注解。让我们来看看@EnableAspectJAutoProxy注解的源码,如下所示。
从源码可以看出,@EnableAspectJAutoProxy注解使用@Import注解引入了AspectJAutoProxyRegister.class对象。那么,AspectJAutoProxyRegistrar是做什么的呢?我们点击到AspectJAutoProxyRegistrar类的源码中,如下所示。
可以看到AspectJAutoProxyRegistrar类实现了ImportBeanDefinitionRegistrar接口。我们回顾ImportBeanDefinitionRegistrar接口的定义,如下所示。
通过ImportBeanDefinitionRegistrar接口,我们可以实现将自定义的组件添加到IOC容器中。也就是说,@EnableAspectJAutoProxy注解使用AspectJAutoProxyRegistrar对象自定义组件,并将相应的组件添加到IOC容器中。
在AspectJAutoProxyRegistrar类的registerBeanDefinitions()方法中设置断点,我们以debug的方法来运行AopTest类的testAop()方法。当程序运行到断点位置时,我们可以看到程序已经暂停,IDEA的左下角显示了方法的调用栈。
在registerBeanDefinitions()方法中,首先调用AopConfigUtils类的registerAspectJAnnotationAutoProxyCreatorIfNecessary()方法来注册registry。在registerAspectJAnnotationAutoProxyCreatorIfNecessary()方法中,直接调用了重载的registerAspectJAnnotationAutoProxyCreatorIfNecessary()方法。在重载的registerAspectJAnnotationAutoProxyCreatorIfNecessary()方法中,传入了AnnotationAwareAspectJAutoProxyCreator.class对象。
在registerOrEscalateApcAsRequired()方法中,接收到的Class对象的类型为:org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator。然后,我们继续跟进代码。
在registerOrEscalateApcAsRequired()方法中,首先判断registry是否包含org.springframework.aop.config.internalAutoProxyCreator类型的bean。接下来,我们继续看代码。
最终,AopConfigUtils类的registerOrEscalateApcAsRequired()方法中,会通过registry调用registerBeanDefinition()方法注册组件,并注册的bean的名称为org.springframework.aop.config.internalAutoProxyCreator。
接下来,我们继续看AspectJAutoProxyRegistrar类的registerBeanDefinitions()源码。我们通过AnnotationConfigUtils类的attributesFor方法来获取@EnableAspectJAutoProxy注解的信息。接下来,我们继续判断proxyTargetClass属性的值是否为true,如果为true则调用AopConfigUtils类的forceAutoProxyCreatorToUseClassProxying()方法;继续判断exposeProxy属性的值是否为true,如果为true则调用AopConfigUtils类的forceAutoProxyCreatorToExposeProxy()方法。
综上所述,向Spring的配置类上添加@EnableAspectJAutoProxy注解后,会向IOC容器中注册AnnotationAwareAspectJAutoProxyCreator。
了解了这些之后,我们就可以关注「冰河技术」微信公众号,后台回复不同的关键字获取相应的PDF文档。这些文档都是由冰河原创并整理的超硬核教程,包括《深入浅出Java 种设计模式》、《Java8新特性教程》和《亿级流量下的分布式限流解决方案》,都是面试必备的资料。
最后,如果你觉得这篇文章对你有帮助,别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起进步!
IOCåAOPçåºå«ï¼
ä»ä¹æ¯IoC
IocâInversion of Controlï¼å³âæ§å¶å转âï¼ä¸æ¯ä»ä¹ææ¯ï¼èæ¯ä¸ç§è®¾è®¡ææ³ãå¨Javaå¼åä¸ï¼Iocæå³çå°ä½ 设计好ç对象交ç»å®¹å¨æ§å¶ï¼èä¸æ¯ä¼ ç»çå¨ä½ ç对象å é¨ç´æ¥æ§å¶ãå¦ä½ç解好Iocå¢ï¼ç解好Iocçå ³é®æ¯è¦æç¡®âè°æ§å¶è°ï¼æ§å¶ä»ä¹ï¼ä¸ºä½æ¯å转ï¼æå转就åºè¯¥ææ£è½¬äºï¼ï¼åªäºæ¹é¢å转äºâï¼é£æ们æ¥æ·±å ¥åæä¸ä¸ï¼
æ§å¶æ¯ä»ä¹ï¼ä¼ ç»Java SEç¨åºè®¾è®¡ï¼æ们ç´æ¥å¨å¯¹è±¡å é¨éè¿newè¿è¡å建对象ï¼æ¯ç¨åºä¸»å¨å»å建ä¾èµå¯¹è±¡ï¼èIoCæ¯æä¸é¨ä¸ä¸ªå®¹å¨æ¥å建è¿äºå¯¹è±¡ï¼å³ç±Ioc容å¨æ¥æ§å¶å¯¹è±¡çå建ï¼è°æ§å¶è°ï¼å½ç¶æ¯IoC 容å¨æ§å¶äºå¯¹è±¡ï¼æ§å¶ä»ä¹ï¼é£å°±æ¯ä¸»è¦æ§å¶äºå¤é¨èµæºè·åï¼ä¸åªæ¯å¯¹è±¡å æ¬æ¯å¦æ件çï¼ã
为ä½æ¯å转ï¼åªäºæ¹é¢å转äºï¼æå转就ææ£è½¬ï¼ä¼ ç»åºç¨ç¨åºæ¯ç±æ们èªå·±å¨å¯¹è±¡ä¸ä¸»å¨æ§å¶å»ç´æ¥è·åä¾èµå¯¹è±¡ï¼ä¹å°±æ¯æ£è½¬ï¼èå转åæ¯ç±å®¹å¨æ¥å¸®å¿å建åæ³¨å ¥ä¾èµå¯¹è±¡ï¼ä¸ºä½æ¯å转ï¼å 为ç±å®¹å¨å¸®æ们æ¥æ¾åæ³¨å ¥ä¾èµå¯¹è±¡ï¼å¯¹è±¡åªæ¯è¢«å¨çæ¥åä¾èµå¯¹è±¡ï¼æ以æ¯å转ï¼åªäºæ¹é¢å转äºï¼ä¾èµå¯¹è±¡çè·å被å转äºã
IoCè½åä»ä¹
IoCä¸æ¯ä¸ç§ææ¯ï¼åªæ¯ä¸ç§ææ³ï¼ä¸ä¸ªéè¦çé¢å对象ç¼ç¨çæ³åï¼å®è½æ导æ们å¦ä½è®¾è®¡åºæ¾è¦åãæ´ä¼è¯çç¨åºãä¼ ç»åºç¨ç¨åºé½æ¯ç±æ们å¨ç±»å é¨ä¸»å¨å建ä¾èµå¯¹è±¡ï¼ä»è导è´ç±»ä¸ç±»ä¹é´é«è¦åï¼é¾äºæµè¯ï¼æäºIoC容å¨åï¼æå建åæ¥æ¾ä¾èµå¯¹è±¡çæ§å¶æ交ç»äºå®¹å¨ï¼ç±å®¹å¨è¿è¡æ³¨å ¥ç»å对象ï¼æ以对象ä¸å¯¹è±¡ä¹é´æ¯æ¾æ£è¦åï¼è¿æ ·ä¹æ¹ä¾¿æµè¯ï¼å©äºåè½å¤ç¨ï¼æ´éè¦çæ¯ä½¿å¾ç¨åºçæ´ä¸ªä½ç³»ç»æåå¾é常çµæ´»ã
å ¶å®IoC对ç¼ç¨å¸¦æ¥çæ大æ¹åä¸æ¯ä»ä»£ç ä¸ï¼èæ¯ä»ææ³ä¸ï¼åçäºâ主ä»æ¢ä½âçååãåºç¨ç¨åºåæ¬æ¯è大ï¼è¦è·åä»ä¹èµæºé½æ¯ä¸»å¨åºå»ï¼ä½æ¯å¨IoC/DIææ³ä¸ï¼åºç¨ç¨åºå°±åæ被å¨çäºï¼è¢«å¨ççå¾ IoC容å¨æ¥åå»ºå¹¶æ³¨å ¥å®æéè¦çèµæºäºã
IoCåDI
DIâDependency Injectionï¼å³âä¾èµæ³¨å ¥âï¼æ¯ç»ä»¶ä¹é´ä¾èµå ³ç³»ç±å®¹å¨å¨è¿è¡æå³å®ï¼å½¢è±¡ç说ï¼å³ç±å®¹å¨å¨æçå°æ个ä¾èµå ³ç³»æ³¨å ¥å°ç»ä»¶ä¹ä¸ãä¾èµæ³¨å ¥çç®ç并é为软件系ç»å¸¦æ¥æ´å¤åè½ï¼èæ¯ä¸ºäºæåç»ä»¶éç¨çé¢çï¼å¹¶ä¸ºç³»ç»æ建ä¸ä¸ªçµæ´»ãå¯æ©å±çå¹³å°ãéè¿ä¾èµæ³¨å ¥æºå¶ï¼æ们åªéè¦éè¿ç®åçé ç½®ï¼èæ éä»»ä½ä»£ç å°±å¯æå®ç®æ éè¦çèµæºï¼å®æèªèº«çä¸å¡é»è¾ï¼èä¸éè¦å ³å¿å ·ä½çèµæºæ¥èªä½å¤ï¼ç±è°å®ç°ã
注ï¼å¦ææ³è¦æ´å æ·±å ¥çäºè§£IoCåDIï¼è¯·åè大å¸çº§äººç©Martin Fowlerçä¸ç¯ç»å ¸æç« ãInversion of Control Containers and the Dependency Injection patternãï¼åæå°åï¼/articles/injection.htmlã
AOPï¼é¢ååé¢ç¼ç¨
ä»ä¹æ¯AOPï¼
æ¦å¿µï¼å¨è½¯ä»¶ä¸ï¼AOP为Aspect Oriented Programmingç缩åï¼æ为ï¼é¢ååé¢ç¼ç¨ï¼éè¿é¢ç¼è¯æ¹å¼åè¿è¡æå¨æ代çå®ç°ç¨åºåè½çç»ä¸ç»´æ¤çä¸ç§ææ¯ãAOPæ¯OOPç延ç»ï¼æ¯è½¯ä»¶å¼åä¸çä¸ä¸ªçç¹ï¼ä¹æ¯Springæ¡æ¶ä¸çä¸ä¸ªéè¦å 容ï¼æ¯å½æ°å¼ç¼ç¨çä¸ç§è¡çèåãå©ç¨AOPå¯ä»¥å¯¹ä¸å¡é»è¾çå个é¨åè¿è¡é离ï¼ä»è使å¾ä¸å¡é»è¾åé¨åä¹é´çè¦å度éä½ï¼æé«ç¨åºçå¯éç¨æ§ï¼åæ¶æé«äºå¼åçæçãï¼ç¾åº¦ç¾ç§ï¼
ç®åç说ï¼å°±æ¯å°ç¨åºä¸éå¤ç代ç æ½ååºæ¥ï¼å¨éè¦æ§è¡çæ¶åï¼ä½¿ç¨å¨æ代ççææ¯ï¼å¨ä¸ä¿®æ¹æºç çåºç¡ä¸ï¼å¯¹æ们çå·²ææ¹æ³è¿è¡å¢å¼ºã
AOPçä½ç¨åä¼å¿ï¼
ä½ç¨ï¼ä»å®ä¹ä¸æ¥çï¼å°±æ¯ä¸ºäºå¨ç¨åºè¿è¡æé´ï¼ä¸ä¿®æ¹æºç 对已ææ¹æ³è¿è¡å¢å¼ºã
ä¼å¿ï¼åå°éå¤ä»£ç æ交äºå¼åæç ç»´æ¤æ¹ä¾¿
å®ç°æ¹å¼ï¼ å°±æ¯å¨æ代ççææ¯
å ·ä½çä½ç¨ï¼å®ç°äºå¡çæ§å¶ æ¥å¿ å å®å ¨æ¨¡å
æ³ç³»ç»çå¦ä¹ ç¼ç¨å¯ä»¥æ¥æè¿ççï¼å¸æ对æ¨ææ帮å©ï¼~
Spring IoC源码深度剖析
Spring IoC容器初始化深度剖析
Spring IoC容器是Spring的核心组件,主要负责对象管理和依赖关系管理。容器体系丰富多样,如BeanFactory作为顶层容器,它定义了所有IoC容器的基本原则,而ApplicationContext及其子类如ClassPathXmlApplicationContext和AnnotationConfigApplicationContext则提供了额外功能。Spring IoC容器的初始化流程关键在AbstractApplicationContext的refresh方法中。 1.1 初始化关键点 通过创建特定类LagouBean并设置断点,我们发现Bean的创建在未设置延迟加载时,发生在容器初始化过程中。构造函数调用、InitializingBean的afterPropertiesSet方法以及BeanFactoryPostProcessor和BeanPostProcessor的初始化和调用,都在refresh方法的不同步骤中发生。 1.2 主体流程概览 Spring IoC容器初始化的主体流程主要集中在AbstractApplicationContext的refresh方法,涉及Bean对象创建、构造函数调用、初始化方法执行和处理器调用等步骤。 1.3 深度剖析 分析发现,延迟加载机制使得懒加载的bean在第一次调用getBean时才进行初始化。而对于非懒加载bean,它们在容器初始化阶段已经完成并缓存。Spring处理循环依赖的方法依赖于构造器调用的顺序规则,不支持原型bean的循环依赖,而对单例bean则通过setXxx或@Autowired方法提前暴露对象来避免循环依赖。