`
jiwenke
  • 浏览: 397337 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
4ee69929-b8e1-3eb5-bbca-157d075d6192
Spring技术内幕——深...
浏览量:181828
D1c226f7-74e9-3ec4-a15b-18a45ccd88c5
随笔:Spring与云计算...
浏览量:25554
社区版块
存档分类
最新评论

Re: Spring源代码解析(一):IOC容器

阅读更多
[quote="bennyparlo"] 没错,可以参考spring reference中的1段说明: 3.3. 属性,合作者,自动装配和依赖检查 3.3.1. 设置bean的属性和合作者 ................ 通常你可以信任Spring做了正确的事情。它会在BeanFactory装载的时候检查出错误,包括对不存在bean的引用和循环引用。它会尽可能晚地设置属性和解决依赖(比如创建那些需要的依赖),也就是在bean真正被创建的时候。这就意味着:就算一个BeanFactory被正确地装载,稍后当你请求一个bean的时候,如果创建那个bean或者它的依赖的时候出现了错误,这个BeanFactory也会抛出一个异常。比如,如果一个bean抛出一个异常作为缺少或非法属性的结果,这样的情况就会发生。这种潜在地推迟一些配置错误可见性的行为正是ApplicationContext默认预实例化singleton bean的原因。以前期的时间和内存为代价在beans真正需要之前创建它们,你就可以在ApplicationContext创建的时候找出配置错误,而不是在后来。如果你愿意,你也可以覆盖这种默认的行为,设置这些singleton bean为lazy-load(不是预实例化的)。 这里是翻译版的原文.应该可以对应你说的这段了.[/quote] 呵呵,把代码找出来,验证一下,这里涉及到一个预实例化的问题,也是BeanFactory和上下文使用的一个区别,也牵涉到一个bean定义属性lazy-init的使用: 我们记得在在上下文初始化的时候会通过refresh来完成 - 在AbstractApplicationContext中: [code] public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // 这里是定位,读入,解析和注册bean定义的地方 refreshBeanFactory(); ....... try { ........ // 这里是对bean作预实例化的地方,也是lazy-init属性起作用的地方 beanFactory.preInstantiateSingletons(); // Last step: publish corresponding event. publishEvent(new ContextRefreshedEvent(this)); } catch (BeansException ex) { // Destroy already created singletons to avoid dangling resources. beanFactory.destroySingletons(); throw ex; } } } [/code] 在DefaultListableBeanFactory中, [code] public void preInstantiateSingletons() throws BeansException { if (logger.isInfoEnabled()) { logger.info("Pre-instantiating singletons in factory [" + this + "]"); } //这里迭代所有的bean定义 for (Iterator it = this.beanDefinitionNames.iterator(); it.hasNext();) { String beanName = (String) it.next(); if (!containsSingleton(beanName) && containsBeanDefinition(beanName)) { RootBeanDefinition bd = getMergedBeanDefinition(beanName, false); //预实例化只对singleton和lazy-init设为false的bean起作用 //而实际的预实例化就是在容器启动的过程就把依赖注入,而不是等到用户要求的时候 //调用getBean,和用户第一次要求的时候处理是一样的 if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { Class beanClass = resolveBeanClass(bd, beanName); if (beanClass != null && FactoryBean.class.isAssignableFrom(beanClass)) { getBean(FACTORY_BEAN_PREFIX + beanName); } else { getBean(beanName); } } } } } [/code] 而这个lazy-init的属性是在BeanDefinitionParserDelegate中设置的,但值得注意的是这里只作设置不做处理,处理要放到预实例化中去作。 [code] public AbstractBeanDefinition parseBeanDefinitionElement( Element ele, String beanName, BeanDefinition containingBean) { ........ //这里取得属性值,在bean定义文件中 String lazyInit = ele.getAttribute(LAZY_INIT_ATTRIBUTE); //如果是默认的值并且这个bean是单例,设为false if (DEFAULT_VALUE.equals(lazyInit) && bd.isSingleton()) { // Just apply default to singletons, as lazy-init has no meaning for prototypes. lazyInit = getDefaultLazyInit(); } //否则设为true bd.setLazyInit(TRUE_VALUE.equals(lazyInit)); ........ } [/code] 需要注意的是,getBean是BeanFactory的接口方法,而这里的调用都是在上下文中的。
分享到:
评论
3 楼 xo_tobacoo 2009-02-10  
不错!学习了
2 楼 zxming12345 2008-10-16  
从排一下版吧。格式好像出错了。读起来很费力。
1 楼 weicd_80 2008-08-26  
其实我也想学习一下spring的源码

相关推荐

    Spring源代码解析(一):IOC容器.doc

    Spring源代码解析(一):IOC容器.doc

    Spring源代码解析

    Spring源代码解析(一):IOC容器 Spring源代码解析(二):IoC容器在Web容器中的启动 Spring源代码解析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源...

    Spring源代码解析.rar

    Spring源代码解析1:IOC容器.doc Spring源代码解析2:IoC容器在Web容器中的启动.doc Spring源代码解析3:Spring JDBC .doc Spring源代码解析4:Spring MVC .doc Spring源代码解析5:Spring AOP获取Proxy .doc Spring...

    Spring 源代码解析

    Spring源代码解析1:IOC容器;Spring源代码解析2:IoC容器在Web容器中的启动;Spring源代码解析3:Spring JDBC ; Spring源代码解析4:Spring MVC ;Spring源代码解析5:Spring AOP获取Proxy;Spring源代码解析6:...

    Spring源代码解析(二):IoC容器在Web容器中的启动.doc

    Spring源代码解析(二):IoC容器在Web容器中的启动.doc

    spring源码分析(1-10)

    Spring源代码解析(二):ioc容器在Web容器中的启动 Spring源代码分析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源代码解析(六):Spring声明式事务处理...

    spring源码分析

    Spring源代码解析(二):ioc容器在Web容器中的启动 3.Spring源代码解析(三):Spring JDBC 4.Spring源代码解析(四):Spring MVC 5.Spring源代码解析(五):Spring AOP获取Proxy 6. Spring源代码解析(六):Spring...

    springyuanmaaping.zip

    Spring源代码解析2:IoC容器在Web容器中的启动;Spring源代码解析3:Spring JDBC ; Spring源代码解析4:Spring MVC ;Spring源代码解析5:Spring AOP获取Proxy;Spring源代码解析6:Spring声明式事务处理 ; ...

    Spring源码学习文档,绝对值得好好研究~~

    Spring源代码解析(二):ioc容器在Web容器中的启动.doc Spring源代码分析(三):Spring JDBC.doc Spring源代码解析(四):Spring MVC.doc Spring源代码解析(五):Spring AOP获取Proxy.doc Spring源代码解析(六):...

    spring源代码解析

    对于一个Spring激活的web应用程序,可以通过使用Spring代码声明式的指定在web应用程序启动时载入应用程序上下文(WebApplicationContext),Spring的ContextLoader是提供这样性能的类,我们可以使用 ...

    Spring5 框架 ---- IOC容器 ---- 代码

    Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...

    spring Ioc容器配置

    spring Ioc容器配置 IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root ...

    springIOC核心组件分析.vsdx

    pring源代码各个模块作用 核心模块: 1 spring-core:核心模块 依赖注入IOC和DI的最基本实现 spring-beans:Bean工厂与装配 spring-context:上下文,即IOC容器 spring-context-support:对IOC的扩展,以及IOC子容器 ...

    SpringIOC示例源代码

    SpringIOC示例源代码,包括bean.xml配置文件等信息。

    Spring技术内幕:深入解析Spring架构与设计原理

    《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从本书中参透Spring框架的出色架构和设计思想,还能从...

    Java-Spring-SpringIoC容器-SpringIoC的学习

    Java-Spring-SpringIoC容器-SpringIoC的学习 SpringIoC容器的学习笔记 主要介绍了IoC容器工作原理以及如何配置IoC容器 通过标签和注解配置容器

    Spring中IoC优点与缺点解析

    主要为大家详细解析了Spring中IoC优点与缺点,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Spring的IOC容器

    讲的非常不错的Spring书籍,特别有利于对IOC容器的理解,特别推荐哦

Global site tag (gtag.js) - Google Analytics