SSM源码剖析读书笔记--第四章(Part 1)

本书是  互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析

Spring Bean的运行(获取、创建)实现

 

前面剖析了 Spring 的整个加载机制及启动机制,而这绝大部分都是 为了 getBean(getBean是Spring上下文,是Spring BeanFactor获取创建 Bean的核心入口)做准备的,因为Bean工厂最重要的职责就是获得Bean 并将其提供给调用方使用(在属性依赖注入时,或者Spring框架启动且 需要获取当前Bean实例时)。

 

如图4-2所示,Spring getBean实现 了在获取 Bean实例的过程中对Bean的实时创建和加载,如果没有获取 预加载的Bean,则会去父工厂中获取Bean实例,如果仍然没有获取这个 被依赖的Bean实例,则需要解析并创建这个被依赖的Bean实例。 createBean是由AbstractAutowiredCapableBeanFactory实现的, AbstractBean Factory getBean 方法对整个流程进行组装(又是一个标准 的模板方法设计模式)。同时,单例Bean由单独的类来管理。在Bean创 建完成以后,直接调用类型转换器进行转换,体现了职责清晰、处理灵 活的设计。

 

如果当前 Bean的类型是FactoryBean,则在getBean时不是直接返回 当前 Bean实例,而是先获取Bean实例,然后在第十步时调用其工厂方法getObjectForBeanInstance)获取Bean 实例

 

Spring Bean的生命周期主要如下。

◎ 单例(Singleton)的生命周期和 Spring 上下文的生命周期一 致,自始至终只被Sping创建一次。

◎ 多例(Prototype)的生命周期在事件级别,每触发一次 getBean,调用方获取的实例就是新的。

◎ Request的生命周期在HTTP请求级别,在每次Web HTTP请求中 都被创建一次。

◎ Session的生命周期在HTTP Session级别,在每个HTTP Session中 都被创建一次。

◎ Global Session的生命周期类似于Session的生命周期,但仅在基 于Portlet的Web应用中有意义。PorletSession继承自HttpSession,使用目 的和HttpSession一致。

◎ Application的生命周期与整个Web应用的生命周期一致。

getBean方法最终会调用doGetBean方法,而doGetBean方法会调用doCreateBean方法。

getBean方法doGetBean方法都在AbstractBeanFactory中,doCreateBean方法在AbstractAutowireCapableBeanFactory

 

注:

ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountService as  = (IAccountService)ac.getBean("accountService");

上面的getbean方法会调用位于AbstractApplicationContext中的getbean方法。

getBean方法执行时会调用AbstractBeanFactory中的doGetBean方法。

而doGetBean方法执行时会调用AbstractAutowireCapableBeanFactorydoCreateBean方法。

 

Resource resource = new ClassPathResource("bean.xml");
  BeanFactory factory = new XmlBeanFactory(resource);
IAccountService as  = (IAccountService)factory.getBean("accountService");

而上面的getBean方法会调用AbstractBeanFactory中的getBean方法

Getbean方法执行时会调用AbstractBeanFactory中的doGetBean方法。

而doGetBean方法执行时会调用AbstractAutowireCapableBeanFactorydoCreateBean方法。

补充:AbstractBeanFactory与AbstractApplicationContext

 

下面是getbean过程中,AbstractAutowireCapableBeanFactory中的docreatebean方法流程

 

注:这一部分笔记写的并不详细,我重新写了篇  Spring Bean的运行实现源码解析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值