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

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容器,特别是BeanFactory接口,它是所有Spring容器的基础。 BeanFactory接口是Spring的基石,它定义了基本的容器操作,如获取Bean、检查Bean是否存在、确定Bean的...

    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源代码解析

    在"spring源代码解析(一):IOC容器.doc"中,讲解了如何通过XML配置或注解方式定义bean,以及容器如何解析配置并构建对象的依赖关系。同时,也探讨了容器如何通过接口查找和管理bean。 2. **Web环境下的IOC容器...

    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源代码解析(二):IoC容器在Web容器中的启动.doc

    在Spring框架中,IoC(Inversion of Control)容器是核心组件,负责管理应用程序的bean。当我们在Web环境中运行Spring应用时,IoC容器需要在Web容器(如Tomcat、Jetty等)中启动并运行。这个过程涉及到一系列的初始...

    Spring2.5.6源代码分析(一):IOC容器

    本文将通过分析Spring源代码来揭示其IoC容器的工作原理。 首先,我们要理解IoC的概念。IoC是一种设计模式,它将对象的创建和管理从应用逻辑中解耦出来,由一个中心组件(如Spring的ApplicationContext)负责。在...

    Spring源代码解析(六):Spring声明式事务处理.doc

    在整个源代码分析中,我们可以看到 Spring 实现声明式事务管理有三个部分: 1. 对在上下文中配置的属性的处理,这里涉及的类是 TransactionAttributeSourceAdvisor,这是一个通知器,用它来对属性值进行处理,属性...

    spring 源代码解析.zip

    以上只是Spring框架中的一部分关键知识点,实际的源代码解析涉及的内容更为广泛。通过对Spring源代码的学习,我们可以深入了解其设计模式和最佳实践,这对于成为一名优秀的Java开发者至关重要。

    Spring中IoC优点与缺点解析

    IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 优点 1. 简化对象的创建:IoC ...

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

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

    Spring IOC容器实现分析.pdf 下载

    在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,其中的核心组件就是IOC(Inversion of Control)容器。本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以帮助开发者更好地利用这一强大...

    SpringIOC示例源代码

    在这个示例源代码中,我们可以看到多个Java类和一个bean.xml配置文件,这些都是实现Spring IOC的关键组成部分。 首先,让我们了解一下什么是控制反转(IOC)。在传统的程序设计中,对象通常自行创建其依赖项,但在...

    spring Ioc容器配置

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

Global site tag (gtag.js) - Google Analytics