Spring源码之bean的加载(五)准备创建bean
来源:互联网 发布:线割编程招聘 编辑:程序博客网 时间:2024/04/19 10:32
我们继续跟踪代码到createBean,也就是创建创建bean,一同来看一下createBean函数中做了哪些准备工作。首先,我们先来看一张时序图。(相关资源可到这里下载:http://pan.baidu.com/s/1sjSo9a9)
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {if (logger.isDebugEnabled()) {logger.debug("Creating instance of bean '" + beanName + "'");}RootBeanDefinition mbdToUse = mbd;// Make sure bean class is actually resolved at this point, and// clone the bean definition in case of a dynamically resolved Class// which cannot be stored in the shared merged bean definition.Class<?> resolvedClass = resolveBeanClass(mbd, beanName);if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {mbdToUse = new RootBeanDefinition(mbd);mbdToUse.setBeanClass(resolvedClass);}// Prepare method overrides.try {mbdToUse.prepareMethodOverrides();}catch (BeanDefinitionValidationException ex) {throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),beanName, "Validation of method overrides failed", ex);}try {// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.Object bean = resolveBeforeInstantiation(beanName, mbdToUse);if (bean != null) {return bean;}}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,"BeanPostProcessor before instantiation of bean failed", ex);}Object beanInstance = doCreateBean(beanName, mbdToUse, args);if (logger.isDebugEnabled()) {logger.debug("Finished creating instance of bean '" + beanName + "'");}return beanInstance;}
从代码中,我们可以做以下的总结:
1) 根据设置的class属性或者根据className来解析Class。
2) 对override属性进行标记及验证
public void prepareMethodOverrides() throws BeanDefinitionValidationException {// Check that lookup methods exists.MethodOverrides methodOverrides = getMethodOverrides();if (!methodOverrides.isEmpty()) {for (MethodOverride mo : methodOverrides.getOverrides()) {prepareMethodOverride(mo);}}}
上面的方法中,我们要留意的是prepareMethodOverride函数,所以下面是这个函数的实现。
protected void prepareMethodOverride(MethodOverride mo) throws BeanDefinitionValidationException {//获取对应类中对应方法的个数int count = ClassUtils.getMethodCountForName(getBeanClass(), mo.getMethodName());if (count == 0) {throw new BeanDefinitionValidationException("Invalid method override: no method with name '" + mo.getMethodName() +"' on class [" + getBeanClassName() + "]");}else if (count == 1) {// Mark override as not overloaded, to avoid the overhead of arg type checking.mo.setOverloaded(false);}}
3) 应用初始化前的后处理器,解析指定bean是否存在初始化前的短路操作
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {Object bean = null;if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {// Make sure bean class is actually resolved at this point.if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {Class<?> targetType = determineTargetType(beanName, mbd);if (targetType != null) {bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);if (bean != null) {bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);}}}mbd.beforeInstantiationResolved = (bean != null);}return bean;}
上述方法,我们关心的是applyBeanPostProcessorsAfterInitialization的方法,下面给出其代码。
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {result = beanProcessor.postProcessAfterInitialization(result, beanName);if (result == null) {return result;}}return result;}
4) 创建bean
0 0
- Spring源码之bean的加载(五)准备创建bean
- Spring源码(五)-bean的加载(下)
- spring 源码探索--bean加载准备阶段
- Spring源码之bean的加载(一)
- Spring源码解析之Bean的加载
- spring源码学习(五)Bean的加载(上)
- bean的加载(六)准备创建bean
- Spring源码之bean的加载(四)获取单例
- spring源码阅读之Bean的加载(一)
- spring源码阅读之Bean的加载(二)
- Spring源码分析之Bean的加载流程
- Spring源码解析之bean的创建和销毁
- Spring源码之bean的加载(二)获取单例bean
- Spring源码之bean的加载(三)从bean中获取对象
- spring源码初步学习-bean的加载
- Spring源码解析-bean的加载
- Spring源码(四)-bean的加载(上)
- Spring源码深度解析(五)加载Bean
- 解决DRM找不到的问题。
- Facebook Phone Interview -- Move Zeros to Right (Easy)
- 嵌入式编程基础知识学习(1)
- Spring源码之bean的加载(四)获取单例
- 并查集
- Spring源码之bean的加载(五)准备创建bean
- 【杭电oj】2277 - Change the ball(找规律)
- Using multiple LLVM versions on Ubuntu
- 【BZOJ 4443】 [Scoi2015]小凸玩矩阵|二分|最大匹配|匈牙利
- Java命名规范及给自己写的方法添加注解
- 【BZOJ 4448】 [Scoi2015]情报传递|树链剖分|树套树
- spring初步和struts2整合
- [J2EE]java操作json
- 用数学方法解决工程问题系列(三) 判断任意给定一点是否在多边形内