bean的加载(四)从bean的实例中获取对象
来源:互联网 发布:货运gps数据 编辑:程序博客网 时间:2024/04/29 20:42
在getBean方法中,getObjectForBeanInstance是个频繁使用的方法,无论是从缓存中获得bean还是根据不同的scope策略加载bean.总之,我们得到bean的实例后,要做的第一步就是调用这个方法来检测一下正确性,其实就是检测获得Bean是不是FactoryBean类型的bean,如果是,那么需要调用该bean对应的FactoryBean实例中的getObject()作为返回值。
无论是从缓存中获取到的bean还是通过不同的scope策略加载的bean都只是最原始的bean状态,并不一定是我们最终想要的bean.举个例子,加入我们需要对工厂bean进行的处理,那么这里得到的其实是工厂bean的初始状态,但我们真正想要的是工厂bean中定义的factory-method方法中返回的bean,而getObjectForBeanInstance方法就是完成这个。
这个方法中没有太多重要信息,大多是辅助代码以及一些功能性判断,而真正的核心代码委托给了getObjectFromFactoryBean:
在这段代码中,没有太多东西,基本上做了一件事情,就是如果返回的bean是单例的,就必须保证全局唯一,同时不可重复创建,可以使用缓存来提高性能,也就是说加载过就记录下来以便于下次复用。而在doGetObjectFromFactoryBean我们看到了想要的方法,就是Object=factory.getObejct().
以前我们曾经介绍过FactoryBean的调用方法,如果bean声明为FactoryBean类型,则当提取bean时候提取的不是FactoryBean,而是FactoryBean中对应的getObject方法返回的bean,而doGetObjectFromFactroyBean真是实现这个功能。而调用完doGetObjectFromFactoryBean方法后,并没有直接返回,getObjectFromFactoryBean方法中还调用了object = postProcessObjectFromFactoryBean(object, beanName);方法,在子类AbstractAutowireCapableBeanFactory,有这个方法的实现:
对于后处理器的使用,我们目前还没接触,后续会有大量篇幅介绍,这里我们只需要了解在Spring获取bean的规则中有这样一条:尽可能保证所有bean初始化后都会调用注册的BeanPostProcessor的postProcessAfterInitialization方法进行处理,在实际开发过程中大可以针对此特性设计自己的业务处理
- bean的加载(四)从bean的实例中获取对象
- Spring源码之bean的加载(三)从bean中获取对象
- spring 从bean实例中获取对象
- 从bean中获取对象的属性值
- Spring中从ApplicationContext中获取bean与从bean工厂中获取bean的区别
- bean的加载(八)创建bean的实例
- spring bean加载--从缓存中获取beanspring bean加载--从缓存中获取bean【转】
- spring bean加载--从缓存中获取bean
- spring bean加载--从缓存中获取bean
- 获取Spring加载的实例bean/获取注解Beam
- bean的加载(三)缓存中获取单例bean
- 读Spring的源代码四:获取bean实例的过程
- Spring源码之bean的加载(四)获取单例
- Bean对象的实例化
- 从ApplicationContex 应用上下文容器中获取bean和从bean工厂容器中获取bean的区别
- bean的加载(七)创建bean
- bean的加载(十一)初始化bean
- 一个对象实例化后从spring容器取出放在bean对象中,写出获取它的属性的set方法
- 《Motion Design for iOS》(三十二)
- PHP判断二级域名,301跳转
- Java异常收集 - 反射相关
- 如何完美定制 Ubuntu 控制台及 vim
- 有一段时间没来了,总结一下
- bean的加载(四)从bean的实例中获取对象
- java 如何完美编写对象的equal方法
- pyquery ----用法
- UEFI引导模式和GPT分区形式下安装windows操作系统
- java实现的读写锁
- 创建windows service
- TextView常用属性介绍
- sysconf、pathconf和fpathconf函数
- Swift Swizzled