spring Bean加载

来源:互联网 发布:易语言发送qq消息源码 编辑:程序博客网 时间:2024/06/06 02:39
1.转换对应的beanName
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;}


原创粉丝点击