本书是 互联网轻量级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方法执行时会调用AbstractAutowireCapableBeanFactory中doCreateBean方法。
Resource resource = new ClassPathResource("bean.xml");
BeanFactory factory = new XmlBeanFactory(resource);
IAccountService as = (IAccountService)factory.getBean("accountService");
而上面的getBean方法会调用AbstractBeanFactory中的getBean方法
Getbean方法执行时会调用AbstractBeanFactory中的doGetBean方法。
而doGetBean方法执行时会调用AbstractAutowireCapableBeanFactory中doCreateBean方法。
补充:AbstractBeanFactory与AbstractApplicationContext
下面是getbean过程中,AbstractAutowireCapableBeanFactory中的docreatebean方法流程
注:这一部分笔记写的并不详细,我重新写了篇 Spring Bean的运行实现源码解析