spring Bean加载
来源:互联网 发布:易语言发送qq消息源码 编辑:程序博客网 时间:2024/06/06 02:39
1.转换对应的beanName
2.尝试从缓存里面加载
3.bean实例化
4.原型模式的依赖检查
5.检查parentBeanFactory
6.将存储xml配置文件的gernerricBeanDefinition转换为RootBeanDefinition
7.寻找依赖
8.针对不同的scope进行bean的创建
2.尝试从缓存里面加载
3.bean实例化
4.原型模式的依赖检查
5.检查parentBeanFactory
6.将存储xml配置文件的gernerricBeanDefinition转换为RootBeanDefinition
7.寻找依赖
8.针对不同的scope进行bean的创建
9.类型转换
直接贴代码吧
获取bean主代码如下:3.0.5版本
protected <T> T doGetBean(final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)throws BeansException {//转换对应的baanNamefinal String beanName = transformedBeanName(name);Object bean;// 尝试从缓存中获取Object sharedInstance = getSingleton(beanName);if (sharedInstance != null && args == null) {if (logger.isDebugEnabled()) {if (isSingletonCurrentlyInCreation(beanName)) {logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +"' that is not fully initialized yet - a consequence of a circular reference");}else {logger.debug("Returning cached instance of singleton bean '" + beanName + "'");}}//bean实例化(从工厂bean中获取)bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);}else {// 循环依赖(A包含B,同时B包含A)if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}// 获取parentBeanFactoryBeanFactory parentBeanFactory = getParentBeanFactory();if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {// 获取parentBeanFactory的原型name(&name)String nameToLookup = originalBeanName(name);if (args != null) {// 获取beanreturn (T) parentBeanFactory.getBean(nameToLookup, args);}else {// 如果没有参数根据类型获取return parentBeanFactory.getBean(nameToLookup, requiredType);}}if (!typeCheckOnly) {//设置已经创建markBeanAsCreated(beanName);}//获取RootBeanDefinitionfinal RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);//检查checkMergedBeanDefinition(mbd, beanName, args);//寻找依赖并且解决String[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {for (String dependsOnBean : dependsOn) {getBean(dependsOnBean);registerDependentBean(dependsOnBean, beanName);}}// 开始创建实例if (mbd.isSingleton()) {//单例模式创建sharedInstance = getSingleton(beanName, new ObjectFactory() {public Object getObject() throws BeansException {try {return createBean(beanName, mbd, args);}catch (BeansException ex) {//如果有异常销毁已经创建的操作destroySingleton(beanName);throw ex;}}});bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}else if (mbd.isPrototype()) {//原型模式创建// It's a prototype -> create a new instance.Object prototypeInstance = null;try {beforePrototypeCreation(beanName);prototypeInstance = createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}else {//scope方式创建String scopeName = mbd.getScope();final Scope scope = this.scopes.get(scopeName);if (scope == null) {throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'");}try {Object scopedInstance = scope.get(beanName, new ObjectFactory() {public Object getObject() throws BeansException {beforePrototypeCreation(beanName);try {return createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}}});bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch (IllegalStateException ex) {throw new BeanCreationException(beanName,"Scope '" + scopeName + "' is not active for the current thread; " +"consider defining a scoped proxy for this bean if you intend to refer to it from a singleton",ex);}}}// 类型检查if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) {throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}return (T) bean;}
阅读全文
0 0
- Spring-搞定bean加载
- spring bean 加载顺序
- spring bean 加载顺序
- spring延迟加载bean
- spring bean 加载顺序
- Spring 加载bean
- spring加载bean原理。
- spring动态加载Bean
- spring bean的加载
- spring bean 加载顺序
- Spring Bean 加载顺序
- spring加载bean
- Spring加载Bean
- spring bean加载过程
- spring Bean加载
- spring的bean加载
- Spring Bean加载过程
- Spring 动态加载bean
- 存储相关常量
- java 高级面试题1
- 【Linux】信号的阻塞和递达
- 关于.NET编程中各种事务的实现
- URG和PSH
- spring Bean加载
- JavaScript之遍历
- 富文本方式超链接
- 45 超声波测距模块的linux platform驱动模型实现
- 统计学习笔记六----朴素贝叶斯
- 欢迎使用CSDN-markdown编辑器
- Spring的AOP原理
- javascript 中的index()属性与lastIndex()属性
- 正则相关常量