1.【Spring源码】7.如何添加自定义的码包BeanFactoryPostProcessor
2.Spring源码3. xml文件如何转换成BeanDefinition
3.Spring扩展点探索之BeanFactoryPostProcessor
4.Spring源码系列-BeanPostProcessor与BeanFactoryPostProcessor
5.Springä¸BeanFactoryä¸FactoryBeançä½ç¨ä¸åºå«
6.Spring容器之refresh方法源码分析
【Spring源码】7.如何添加自定义的BeanFactoryPostProcessor
关于BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的父子关系鉴定:
由图示可知,BeanDefinitionRegistryPostProcessor是码包BeanFactoryPostProcessor的子类。
实现步骤包括新建类并实现接口,码包通过配置文件或自定义函数让Spring识别。码包
实现方式一:在配置文件中定义,码包启动类添加代码,码包软件出售源码输出结果验证。码包
实现方式二:重写ClassPathXmlApplicationContext的码包customizeBeanFactory函数,新建MyApplicationContext类,码包修改启动类,码包再次验证。码包
两种方法区别在于,码包方式二虽能成功执行新建类,码包但spring上下文对象的码包BeanDefinitionNames和BeanDefinitionMap不包含这些类。
使用Debug方式进一步确认,码包方式一能将新建类添加到Spring上下文,而方式二则不会。
总结:通过配置文件让Spring识别更为有效,能将自定义的BeanFactoryPostProcessor类添加到Spring上下文的BeanDefinitionMap和BeanDefinitionNames集合中。
Spring源码3. xml文件如何转换成BeanDefinition
在Spring框架中,要将XML文件转换成BeanDefinition,首先通过测试启动类进入ApplicationContext容器,hadoop源码怎么用设置配置文件路径。关键步骤是调用`refresh()`方法,其中包含以下几个步骤:准备刷新:`prepareRefresh()`
创建工厂:`ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()`,默认使用`DefaultListableBeanFactory`
自定义定制:`customizeBeanFactory(beanFactory)`
加载Bean定义:`loadBeanDefinitions(beanFactory)`
Spring的`loadBeanDefinitions()`方法根据配置方式的不同,会调用多个实现,以XML配置为例,会进入`AbstractXmlApplicationContext`的`loadBeanDefinitions()`,接着进入`XmlBeanDefinitionReader`的`loadBeanDefinitions()`方法,这个过程涉及到了资源路径到`InputSource`和`Resource`的转换,最终加载XML文档生成BeanDefinition。 在这个过程中,`configLocations`的转换路径如下:字符串数组到字符串,再转为Resource数组,进一步转为Resource对象,然后解析为文档,根据文档内容构建BeanDefinition。具体到`registerBeanDefinitions()`方法,BeanDefinition被注册到容器,同时处理了XML文档的解析和BeanName的管理。 最后,BeanDefinition被成功放入`DefaultListableBeanFactory`容器,xposed框架红包源码至此,XML文件的转换过程完成。后续的解析和容器管理将在下篇继续深入探讨。Spring扩展点探索之BeanFactoryPostProcessor
Spring的BeanFactoryPostProcessor是一种强大的工具,它允许在Bean实例化前对Bean的属性进行后置处理。想象一下,如果你的Bean中存在占位符,BeanFactoryPostProcessor就像一个预处理器,负责在配置参数填充这些占位符,确保Bean在初始化时得到正确的值。
这个接口仅需实现一个postProcessBeanFactory()方法,通过它,开发者可以根据需要定制Bean的属性。例如,创建一个User类,配置类将其注册到Spring容器,然后自定义一个MyBeanFactoryPostProcessor,重写postProcessBeanFactory()方法,用于修改User的属性,如将userName从Jack改为Tom。
当你在测试类中获取并打印User对象时,空鸟指标源码可以看到属性已经被修改为Tom。这显示了BeanFactoryPostProcessor如何在初始化阶段灵活地改变Bean的行为。Spring通过refresh()方法中的invokeBeanFactoryPostProcessors()函数,自动调用每个注册的BeanFactoryPostProcessor,实现了这个过程的自动化。
源码分析揭示,Spring内部通过遍历BeanFactoryPostProcessor列表并调用postProcessBeanFactory(),确保在Bean实例化之前,所有定制的处理逻辑得以执行。因此,BeanFactoryPostProcessor是Spring框架中实现Bean属性动态修改的关键环节。
Spring源码系列-BeanPostProcessor与BeanFactoryPostProcessor
在Spring框架中,BeanPostProcessor与BeanFactoryPostProcessor各自承担着不同的职责,它们在IoC容器的工作流程中起着关键作用。
BeanFactoryPostProcessor作用于BeanDefinition阶段,对容器中Bean的定义进行处理。这个过程发生在BeanFactory初始化时,对BeanDefinition进行修改或增强,提供了一种在不修改源代码的情况下定制Bean的机制。相比之下,BeanPostProcessor则在Bean实例化之后生效,北京幸运28源码对已经创建的Bean对象进行进一步处理或替换,提供了更晚、更灵活的扩展点。
以制造杯子为例,BeanFactoryPostProcessor相当于在选择材料和形状阶段进行定制,而BeanPostProcessor则在杯子制造完成后,进行诸如加花纹、抛光等深加工。
在Spring框架中,BeanPostProcessor的使用场景较为广泛,尤其在实现AOP(面向切面编程)时,通过使用代理类替换原始Bean,实现如日志记录、事务管理等功能。
此外,容器在启动后,还会进行消息源初始化、广播器初始化及监听器初始化,为Bean实例化做好准备。完成这些准备工作后,容器会调用registerBeanPostProcessors方法注册BeanPostProcessor,对已创建的Bean进行进一步处理。同时,初始化消息源、广播器和监听器,为后续事件处理做好基础。
总结,BeanFactoryPostProcessor与BeanPostProcessor在Spring IoC容器中的作用各有侧重。前者侧重于对BeanDefinition的定制,后者则是在Bean实例化后的进一步加工,两者共同为构建灵活、可扩展的IoC容器提供了强大的支持。
在深入分析Spring框架的源码时,我们发现refresh()方法的实现中包含了对BeanFactoryPostProcessor和BeanPostProcessor的注册与处理。这些处理步骤确保了容器能够在启动时对Bean进行正确的配置和初始化。
文章中通过一个例子展示了如何使用BeanFactoryPostProcessor替换已注册Bean的实现,以及对其源码的分析。通过例子和源码的结合,读者能够更直观地理解这些后置处理器在Spring框架中的应用和工作原理。
Springä¸BeanFactoryä¸FactoryBeançä½ç¨ä¸åºå«
Spring Frameworkï¼ä»å¹´å¤å¤©ä½ å¯è½å·²ç»å¬è§å¾å¤ç议论ãå¨æ¬æä¸,æå°è¯å¾è§£éSpringè½å®æä»ä¹ï¼åææä¹ä¼è®¤ä¸ºå®è½å¸®å©ä½ å¼åJ2EEåºç¨ç¨åºã å¦ä¸frameworkï¼ ä½ å¯è½æ£å¨æ³âä¸è¿æ¯å¦å¤ä¸ä¸ªçframeworkâãå½å·²ç»æ许å¤å¼æ¾æºä»£ç (åä¸æ) J2EE frameworkæ¶ï¼ä¸ºä»ä¹ä½ åºè¯¥è´¹å¿è¯»è¿ç¯æç« ,æä¸è½½Spring Frameworkï¼ æç¸ä¿¡Springæ¯ç¬ç¹ç,å 为è¥å¹²ä¸ªåå : . å®å®ä½çé¢åæ¯è®¸å¤å ¶ä»æµè¡çframework没æçãSpringå ³æ³¨æä¾ä¸ç§æ¹æ³ç®¡çä½ çä¸å¡å¯¹è±¡ã . Springæ¯å ¨é¢çå模ååçãSpringæåå±çä½ç³»ç»æ,è¿æå³çä½ è½éæ©ä½¿ç¨å®å¤ç«çä»»ä½é¨å,å®çæ¶æä»ç¶æ¯å å¨ç¨³å®çãå æ¤ä»ä½ çå¦ä¹ ä¸ï¼ä½ å¯å¾å°æ大çä»·å¼ãä¾å¦,ä½ å¯è½éæ©ä» ä» ä½¿ç¨Springæ¥ç®ååJDBCç使ç¨,æç¨æ¥ç®¡çææçä¸å¡å¯¹è±¡ã . å®ç设计ä»åºé¨å¸®å©ä½ ç¼åæäºæµè¯ç代ç ãSpringæ¯ç¨äºæµè¯é©±å¨å·¥ç¨ççæ³çframeworkã Springå¯¹ä½ çå·¥ç¨æ¥è¯´ï¼å®ä¸éè¦ä¸ä¸ªä»¥ä¸çframeworkãSpringæ¯æ½å¨å°ä¸ç«å¼è§£å³æ¹æ¡,å®ä½äºä¸å ¸ååºç¨ç¸å ³ç大é¨ååºç¡ç»æãå®ä¹æ¶åå°å ¶ä»framework没æèèå°çå 容ã 尽管å®ä» ä» æ¯ä¸ä¸ªä»å¹´2ææå¼å§çå¼æºå·¥ç¨ï¼ä½Springæè¾é¿çåå²æ ¹åºãè¿ä¸ªå¼æºå·¥ç¨æ¯èµ·æºèªæå¨å¹´åæåºççãExpert One-on-One J2EE设计ä¸å¼åã书ä¸çåºç¡ä»£ç ãè¿æ¬ä¹¦å±ç¤ºäºSpringèåçåºç¡æ¶æãç¶è,è¿ä¸ªåºç¡æ¶æçæ¦å¿µè¦è¿½æº¯å°å¹´çæ©äºæ¶å,并ä¸åæ äºæ为ä¸ç³»åæåçåä¸å·¥ç¨å¼ååºç¡ç»æçç»éªã ä»å¹´1æï¼Springå·²ç»è½æ·äºSourceForgeä¸ãç°å¨æ个å¼å人å,å ¶ä¸6æ¯é«åº¦æå ¥ç积æååã Springçæ¶ææ§çå¥½å¤ å¨æ们è¿å ¥ç»è以åï¼è®©æ们çä¸ä¸Springå¯ä»¥ç»ä¸ä¸ªå·¥ç¨å¸¦æ¥çä¸äºå¥½å¤: . Springè½ææå°ç»ç»ä½ çä¸é´å±å¯¹è±¡,æ è®ºä½ æ¯å¦éæ©ä½¿ç¨äºEJBãå¦æä½ ä» ä» ä½¿ç¨äºStrutsæå ¶ä»çå å«äºJ2EEç¹æAPIsçframeworkï¼ä½ ä¼åç°Springå ³æ³¨äºéçä¸çé®é¢ï¼ã . Springè½æ¶é¤å¨è®¸å¤å·¥ç¨ä¸å¯¹Singletonçè¿å¤ä½¿ç¨ãæ ¹æ®æçç»éªï¼è¿æ¯ä¸ä¸ªä¸»è¦çé®é¢ï¼å®åå°äºç³»ç»çå¯æµè¯æ§åé¢å对象ç¹æ§ã . Springè½æ¶é¤ä½¿ç¨åç§åæ ·æ ¼å¼çå±æ§å®å¶æ件çéè¦,å¨æ´ä¸ªåºç¨åå·¥ç¨ä¸ï¼å¯éè¿ä¸ç§ä¸è´çæ¹æ³æ¥è¿è¡é ç½®ãæ¾ç»æå°è¿·æï¼ä¸ä¸ªç¹å®ç±»è¦æ¥æ¾è¿·å¹»è¬çå±æ§å ³é®åæç³»ç»å±æ§,为æ¤ä¸å¾ä¸è¯»Javadocä¹è³æºç¼ç åï¼æäºSpringï¼ä½ å¯å¾ç®åå°çå°ç±»çJavaBeanå±æ§ãåç½®æ§å¶ç使ç¨(å¨ä¸é¢è®¨è®º)帮å©å®æè¿ç§ç®åã . Springè½éè¿æ¥å£èä¸æ¯ç±»ä¿è¿å¥½çç¼ç¨ä¹ æ¯ï¼åå°ç¼ç¨ä»£ä»·å°å ä¹ä¸ºé¶ã . Spring被设计为让使ç¨å®å建çåºç¨å°½å¯è½å°çä¾èµäºä»çAPIsãå¨Springåºç¨ä¸ç大å¤æ°ä¸å¡å¯¹è±¡æ²¡æä¾èµäºSpringã . 使ç¨Springæ建çåºç¨ç¨åºæäºåå æµè¯ã . Springè½ä½¿EJBç使ç¨æ为ä¸ä¸ªå®ç°éæ©,èä¸æ¯åºç¨æ¶æçå¿ ç¶éæ©ãä½ è½éæ©ç¨POJOsælocal EJBsæ¥å®ç°ä¸å¡æ¥å£ï¼å´ä¸ä¼å½±åè°ç¨ä»£ç ã . Spring帮å©ä½ 解å³è®¸å¤é®é¢èæ é使ç¨EJBãSpringè½æä¾ä¸ç§EJBçæ¿æ¢ç©ï¼å®ä»¬éäºè®¸å¤webåºç¨ãä¾å¦,Springè½ä½¿ç¨AOPæä¾å£°ææ§äºå¡èä¸éè¿ä½¿ç¨EJB容å¨ï¼å¦æä½ ä» ä» éè¦ä¸å个çæ°æ®åºæ交éï¼çè³ä¸éè¦JTAå®ç°ã . Spring为æ°æ®ååæä¾äºä¸è´çæ¡æ¶,ä¸è®ºæ¯ä½¿ç¨JDBCæO/R mapping产åï¼å¦Hibernateï¼ã Springç¡®å®ä½¿ä½ è½éè¿æç®åå¯è¡ç解å³åæ³è§£å³ä½ çé®é¢ãè¿äºç¹æ§æ¯æå¾å¤§ä»·å¼çã Springè½åä»ä¹ï¼ Springæä¾è®¸å¤åè½,å¨æ¤æå°å¿«éå°ä¾æ¬¡å±ç¤ºå ¶å个主è¦æ¹é¢ã ä»»å¡æè¿°ï¼ é¦å ,让æ们æç¡®Springèå´ã尽管Springè¦çäºè®¸å¤æ¹é¢ï¼ä½æ们已ç»ææ¸ æ¥çæ¦å¿µï¼å®ä»ä¹åºè¯¥æ¶ååä»ä¹ä¸åºè¯¥æ¶åã Springç主è¦ç®çæ¯ä½¿J2EEæç¨åä¿è¿å¥½ç¼ç¨ä¹ æ¯ã Springä¸éæ°å¼åå·²æçä¸è¥¿ãå æ¤ï¼å¨Springä¸ä½ å°åç°æ²¡ææ¥å¿è®°å½çå ,没æè¿æ¥æ± ,没æåå¸äºå¡è°åº¦ãè¿äºåæå¼æºé¡¹ç®æä¾(ä¾å¦Commons Logging ç¨æ¥åææçæ¥å¿è¾åºï¼æCommons DBCPç¨æ¥ä½æ°æ®è¿æ¥æ± ),æç±ä½ çåºç¨ç¨åºæå¡å¨æä¾ãå 为åæ ·ççåå ï¼æ们没ææä¾O/R mappingå±ï¼å¯¹æ¤ï¼å·²ææ好ç解å³åæ³å¦HibernateåJDOã Springçç®æ æ¯ä½¿å·²åå¨çææ¯æ´å æç¨ãä¾å¦,尽管æ们没æåºå±äºå¡åè°å¤çï¼ä½æ们æä¾äºä¸ä¸ªæ½è±¡å±è¦çäºJTAæä»»ä½å ¶ä»çäºå¡çç¥ã Spring没æç´æ¥åå ¶ä»çå¼æºé¡¹ç®ç«äºï¼é¤éæ们æå°æ们è½æä¾æ°çä¸äºä¸è¥¿ãä¾å¦ï¼è±¡è®¸å¤å¼å人åï¼æ们ä»æ¥æ²¡æ为Strutsé«å ´è¿ï¼å¹¶ä¸æå°å¨MVC web frameworkä¸è¿ææ¹è¿çä½å°ãå¨æäºé¢åï¼ä¾å¦è½»é级çIoC容å¨åAOPæ¡æ¶ï¼Springæç´æ¥çç«äºï¼ä½æ¯å¨è¿äºé¢åè¿æ²¡æå·²ç»è¾ä¸ºæµè¡ç解å³æ¹æ¡ã(Springå¨è¿äºåºåæ¯å¼è·¯å éã) Springä¹å¾çäºå å¨çä¸è´æ§ã ææçå¼åè é½å¨å±åæ ·ççèµæ,åºç¡æ³æ³ä¾ç¶æ¯Expert One-on-One J2EE设计ä¸å¼åçé£äºã 并ä¸æ们已ç»è½å¤ä½¿ç¨ä¸äºä¸»è¦çæ¦å¿µ,ä¾å¦åç½®æ§å¶ï¼æ¥å¤çå¤ä¸ªé¢åã Springå¨åºç¨æå¡å¨ä¹é´æ¯å¯ç§»æ¤çã å½ç¶ä¿è¯å¯ç§»æ¤æ§æ»æ¯ä¸æ¬¡ææï¼ä½æ¯æ们é¿å ä»»ä½ç¹å®å¹³å°æéæ åå,并ä¸æ¯æå¨WebLogicï¼Tomcatï¼Resinï¼JBossï¼WebSphereåå ¶ä»çåºç¨æå¡å¨ä¸çç¨æ·ã åç½®æ§å¶å®¹å¨ Springçè®¾è®¡æ ¸å¿æ¯ org.springframework.beans å , 为ä¸JavaBeansä¸èµ·å·¥ä½è设计ã è¿ä¸ªå ä¸è¬ä¸ç´æ¥è¢«ç¨æ·ä½¿ç¨, ä½ä½ä¸ºåºç¡ä¸ºæ´å¤çå ¶ä»åè½æå¡. ä¸ä¸ä¸ªè¾é«å±é¢çæ½è±¡æ¯"Bean Factory"ã Spring bean factory æ¯ä¸ä¸ªæ®éçFactoryï¼å®ä½¿å¯¹è±¡è½å¤æå称è·åï¼å¹¶ä¸è½ç®¡ç对象ä¹é´çå ³ç³»ã Bean factories æ¯æ两ç§å¯¹è±¡æ¨¡å¼: . Singletonï¼å¨æ¤æ¨¡å¼ä¸ï¼æä¸ä¸ªå ·æç¹å®å称çå ±äº«å¯¹è±¡å®ä¾ï¼å®å¨æ¥æ¾æ¶è¢«è·åãè¿æ¯é»è®¤çï¼èä¸æ¯æ为ç»å¸¸ä½¿ç¨çãå®å¯¹äºæ ç¶æ对象æ¯ä¸ç§çæ³ç模å¼ã .Prototypeï¼å¨æ¤æ¨¡å¼ä¸ï¼æ¯æ¬¡è·åå°å建ä¸ä¸ªç¬ç«ç对象ãä¾å¦ï¼è¿å¯ä»¥è¢«ç¨äºå 许ç¨æ·æ¥æä»ä»¬èªå·±ç对象ã ç±äº org.springframwork.beans.factory.BeanFactoryæ¯ä¸ä¸ªç®åçæ¥å£ï¼å®è½è¢«ä¸ºäºåºå±åå¨æ¹æ³èå®ç°ãä½ è½å¤æ¹ä¾¿å°å®ç°ä½ èªå·±çBeanFactoryï¼å°½ç®¡å¾å°ç¨æ·éè¦ãæ为常ç¨çå®ä¹æ¯ï¼ .XmlBeanFactoryï¼ å¯è§£æç®åç´è§çå®ä¹ç±»åå½å对象å±æ§çXMLç»æã æ们æä¾äºä¸ä¸ªDTDæ¥ä½¿ç¼åæ´å®¹æã .ListableBeanFactoryImplï¼å¯æä¾è§£æåæ¾å¨å±æ§æ件ä¸çbeanå®ä¹ï¼åå¯éè¿ç¼ç¨å建BeanFactoriesã æ¯ä¸ªbeanå®ä¹å¯è½æ¯ä¸ä¸ªPOJO(éè¿ç±»ååJavaBeanåå§å±æ§å®ä¹)ï¼ææ¯ä¸ä¸ªFactoryBeanãFactoryBeanæ¥å£æ·»å äºä¸ä¸ªé´æ¥å±ãé常ï¼è¿ç¨äºä½¿ç¨AOPæå ¶ä»æ¹æ³æ¥å建代ç对象ï¼ä¾å¦ï¼æ·»å äºå£°ææ§äºå¡ç®¡çç代çã(è¿å¨æ¦å¿µä¸åEJB侦å¬ç¸ä¼¼ï¼ä½å¨å®è·µä¸å®ç°æ´ç®åã) BeanFactoriesè½å¨ä¸ä¸ªå±æ¬¡ç»æä¸å¯éæ©æ§çåä¸ï¼æ ¹æ®æ¥èªç¥å ç继æ¿å®ä¹ãè¿ä½¿å¨æ´ä¸ªåºç¨ä¸å ¬å ±é ç½®çå ±äº«æ为å¯è½ï¼è½ç¶ä¸ªå«èµæºï¼å¦controller servletsï¼ä¹æ¥æä»ä»¬èªå·±çç¬ç«ç对象éåã è¿ç§ä½¿ç¨JavaBeansçå¨æºå¨ç第åç« ä¸ææè¿°ï¼å¨TheServerSideç½ç«ä¸çæå è´¹çPDF(). éè¿BeanFactoryæ¦å¿µï¼Springæ为ä¸ä¸ªåç½®æ§å¶ç容å¨ã(æé常ä¸å欢containerè¿ä¸ªæ¯è¯ï¼å 为å®ä½¿äººèæ³å°éé级容å¨ï¼å¦EJB容å¨ãSpringçBeanFactoryæ¯ä¸ä¸ªå¯éè¿ä¸è¡ä»£ç å建ç容å¨ï¼å¹¶ä¸ä¸éè¦ç¹æ®çé¨ç½²æ¥éª¤ã) ä½äºåç½®æ§å¶èåçæ¦å¿µæ¯å¨Hollywoodååä¸ç»å¸¸è¡¨è¿°ï¼"Donât call me, Iâll call you." IoCå°æ§å¶èè´£æ¬è¿äºæ¡æ¶ä¸ï¼å¹¶è±ç¦»åºç¨ä»£ç ãæ¶åå°é ç½®çå°æ¹ï¼æææ¯è¯´å¨ä¼ ç»ç容å¨ä½ç³»ç»æä¸ï¼å¦EJBï¼ä¸ä¸ªç»ä»¶å¯ä»¥è°ç¨å®¹å¨å¹¶é®âæéè¦å®ç»æåå·¥ä½ç对象Xå¨åªé?âï¼ä½¿ç¨IoC容å¨ååªéæåºç»ä»¶éè¦X对象ï¼å¨è¿è¡æ¶å®¹å¨ä¼æä¾ç»å®ã容å¨åºäºæ¹æ³åä½åºè¿ç§è¯´æï¼æå¯è½æ ¹æ®é ç½®æ°æ®å¦XMLã åç½®æ§å¶çå 个éè¦å¥½å¤ãå¦ï¼ . å 为ç»ä»¶ä¸éè¦å¨è¿è¡æ¶é´å¯»æ¾åä½è ï¼æ以ä»ä»¬å¯ä»¥æ´ç®åçç¼ååç»´æ¤ãå¨SpringçIoCçæ¬éï¼ç»ä»¶éè¿æ´é²JavaBeançsetteræ¹æ³è¡¨è¾¾ä»ä»¬ä¾èµçå ¶ä»ç»ä»¶ãè¿ç¸å½äºEJBéè¿JNDIæ¥æ¥æ¾ï¼EJBæ¥æ¾éè¦å¼å人åç¼å代ç ã . åæ ·åå ï¼åºç¨ä»£ç æ´å®¹ææµè¯ãJavaBeanå±æ§æ¯ç®åçï¼Javaæ ¸å¿çï¼å¹¶ä¸å®¹ææµè¯ï¼ä» ç¼åä¸ä¸ªå å«èªèº«çJunitæµè¯æ¹æ³ç¨æ¥å建对象å设置ç¸å ³å±æ§å³å¯ã . ä¸ä¸ªå¥½çIoCå®ç°éèäºå¼ºç±»åãå¦æä½ ä½¿ç¨ä¸ä¸ªæ®éçfactoryæ¥å¯»æ¾åä½è ï¼ä½ å¿ é¡»éè¿ç±»å转æ¢å°è¿åç»æ转å为æ³è¦çç±»åãè¿ä¸æ¯ä¸ä¸ªä¸»è¦é®é¢ï¼ä½æ¯ä¸é è§ã使ç¨IoCï¼ä½ å¨ä½ ç代ç ä¸è¡¨è¾¾å¼ºç±»åä¾èµï¼æ¡æ¶å°è´è´£ç±»å转æ¢ãè¿æå³çå¨æ¡æ¶é ç½®åºç¨æ¶ï¼ç±»åä¸å¹é å°å¯¼è´é误ï¼å¨ä½ ç代ç ä¸ï¼ä½ æ éæ å¿ç±»å转æ¢å¼å¸¸ã . 大é¨åä¸å¡å¯¹è±¡ä¸ä¾èµäºIoC容å¨çAPIsãè¿ä½¿å¾å¾å®¹æ使ç¨éçä¸æ¥ç代ç ï¼ä¸å¾å®¹æç使ç¨å¯¹è±¡æ 论å¨å®¹å¨å æä¸å¨å®¹å¨å ãä¾å¦ï¼Springç¨æ·ç»å¸¸é ç½®Jakarta Commons DBCPæ°æ®æºä¸ºä¸ä¸ªSpring beanï¼ä¸éè¦äºä»»ä½å®å¶ä»£ç å»åè¿ä»¶äºãæ们说ä¸ä¸ªIoC容å¨ä¸æ¯ä¾µå ¥æ§çï¼ä½¿ç¨å®å¹¶ä¸ä¼ä½¿ä½ ç代ç ä¾èµäºå®çAPIsãä»»ä½JavaBenaå¨Spring bean factoryä¸é½è½æ为ä¸ä¸ªç»ä»¶ã æååºè¯¥å¼ºè°çæ¯ï¼IoC ä¸åäºä¼ ç»ç容å¨çä½ç³»ç»æ( å¦EJB), åºç¨ä»£ç æå°ç¨åº¦çä¾é äºå®¹å¨ãè¿æå³çä½ çä¸å¡å¯¹è±¡å¯ä»¥æ½å¨ç被è¿è¡å¨ä¸åçIoC æ¡æ¶ä¸-æè å¨ä»»ä½æ¡æ¶ä¹å¤-ä¸éè¦ä»»ä½ä»£ç æ¹ã 以æçç»éªåä½ä¸ºSpringç¨æ·ï¼è¿å强è°IoCç»åºç¨ä»£ç 带æ¥ç好å¤æ¯ä¸å®¹æçã IoCä¸æ¯ä¸ä¸ªæ°æ¦å¿µï¼ä½æ¯å®å¨J2EEå¢ä½éé¢ååå°è¾¾é»éæ¶é´ã æä¸äºå¯ä¾éæ©çIoC 容å¨: notably, Apache Avalon, PicoContainer å HiveMind. Avalon ä¸ä¼æ为ç¹å«æµè¡çï¼å°½ç®¡å®å¾å¼ºå¤§èä¸æå¾é¿çåå²ãAvalonæ¯ç¸å½çéé级åå¤æçï¼å¹¶ä¸çèµ·æ¥æ¯æ°çIoC解å³æ¹æ¡æ´å ·ä¾µå ¥æ§ã PicoContaineræ¯ä¸ä¸ªè½»é级èä¸æ´å¼ºè°éè¿æé å¨è¡¨è¾¾ä¾èµæ§èä¸æ¯JavaBean å±æ§ã
Spring容器之refresh方法源码分析
Spring容器的核心接口BeanFactory与ApplicationContext之间的关系是继承,ApplicationContext扩展了BeanFactory的功能,提供了初始化环境、参数、后处理器、事件处理以及单例bean初始化等更全面的服务,其中refresh方法是Spring应用启动的入口点,负责整个上下文的准备工作。 让我们深入分析AbstractApplicationContext#refresh方法在启动过程中的具体操作:准备刷新阶段: 包括系统属性和环境变量的检查和准备。
获取新的BeanFactory: 初始化并解析XML配置文件。
customizeBeanFactory: 个性化BeanFactory设置,如覆盖定义、处理循环依赖等。
loadBeanDefinitions: 通过解析XML文件,创建BeanDefinition对象并注入到容器中。
填充BeanFactory功能: 设置classLoader、表达式语言处理器,增强Aware接口处理,添加AspectJ支持和默认系统环境bean等。
激活BeanFactory后处理器: 分为BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor,分别进行BeanDefinition注册和BeanFactory增强。
注册BeanPostProcessors: 拦截Bean创建的后处理器,按优先级注册。
初始化其他组件: 包括MessageSource、ApplicationEventMulticaster和监听器。
初始化非惰性单例: 预先实例化这些对象。
刷新完成: 通知生命周期处理器并触发ContextRefreshedEvent。
以上是refresh方法在Spring应用启动流程中的关键步骤。以上内容仅为个人理解,如需更多信息,可参考CSDN博客链接。org.springframework.beans.factory.BeanCreationException: Error creating bean with name
Cannot resolve reference to bean 'baseDao' while setting bean property 'baseDao'
ççï¼è¿ä¸ªç±»çé ç½®æ件åå±æ§
Spring容器刷新——obtainFreshBeanFactory
本文讨论的是Spring容器中的刷新过程,重点讲解了创建BeanFactory实例的操作。BeanFactory和ApplicationContext在Spring源码中有多种实现,ApplicationContext在BeanFactory基础上增加了额外功能,如管理应用上下文、提供更丰富的依赖注入等。
在实际应用中,选择使用哪个具体实现取决于项目的特定需求。本文列出了两种常见的实现:AbstractApplicationContext和GenericApplicationContext。
AbstractApplicationContext支持多次刷新,内部维护了一个volatile的DefaultListableBeanFactory实例。刷新逻辑分为两步:首先调用refreshBeanFactory()方法,然后返回此实例通过getBeanFactory()方法。
GenericApplicationContext的实现相对简单,对于obtainFreshBeanFactory()方法的调用几乎不做任何操作。
至于应用程序中使用哪个具体的BeanFactory实现,这取决于项目的配置和需求。在传统的Servlet环境下,通常通过ContextLoaderListener加载上下文,而SpringBoot环境中的ApplicationContext创建则通过ApplicationContextFactory完成。
具体实现细节和流程在不同环境下的差异,如Servlet环境中的ContextLoaderListener和ContextLoader的使用,以及SpringBoot环境中的ApplicationContextFactory的实现,将在后续的文章中进行详细阐述。
spring源码解析bean初始化与依赖注入四
深入解析Spring源码的bean初始化与依赖注入部分,我们将继续从上一篇文章的
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean方法入手。
随后,方法调用
org.springframework.beans.factory.support.AbstractBeanFactory#registerDisposableBeanIfNecessary进行注册
紧接着,调用
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean获取bean实例。
在这一过程中,我们到达了
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#destroySingleton用于销毁单例bean。
然后,再次深入
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean方法进行bean的创建。
紧接着,调用
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation对bean进行前置解析。
之后,再次返回
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean进行bean实例化。
然后,调用
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean再次获取bean实例。
紧接着,进入
org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons进行单例bean的预实例化。
最终,完成bean的初始化后触发回调。
返回
org.springframework.context.support.AbstractApplicationContext#refresh执行上下文刷新,完成bean初始化与依赖注入。
至此,本次关于Spring源码中bean初始化与依赖注入的解析告一段落,以上内容仅供学习参考。