十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本篇内容介绍了“Spring GetBean的使用流程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
创新互联专注于西安网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供西安营销型网站建设,西安网站制作、西安网页设计、西安网站官网定制、小程序开发服务,打造西安网络公司原创品牌,更为您提供西安网站排名全网营销落地服务。
在这之前,先介绍BeanFactory的层次结构,如下:
涉及到的接口和实现类为:
AliasRegistry:别名管理接口,定义了别名管理的功能
SimpleAliasRegistry:AliasRegistry的默认实现,内部用一个
ConcurrentHashMap:管理别名
SingletonBeanRegistry:单例实例管理接口,定义了单例管理的功能
DefaultSingletonBeanRegistry:单例管理实现类,内部用Map维护着被实例化后的所有单例、单例工厂等相关信息。Map的键为bean的唯一标识,Spring内部成为raw name,一般等同于Bean定义中的id或者name或者别名等,具体规则可以从上节BeanDefinition的加载查看,值为相应的对象实例。这边需要指出的一点是,对于bean定义中具有别名意义的字段,如一定情况下的name以及alias字段,只存在于SimpleAliasRegistry维护的内部Map中,通过递归查询的方式可以从一个给定的别名查找到指定的id。
如下,DefaultSingletonBeanRegistry维护的Map中存在key为testBean,value为TestBean的对象,SimpleAliasRegistry维护的Map中存在Key为testBeanAlias1,value为testBean的记录。当通过testBeanAlias1查找bean时,会先通过AliasRegistry查找到testBean,再从通过BeanRegistry查找到对应的Bean实例。
FactoryBeanRegistrySupport:增加缓存FactoryBean实例功能,DefaultSingleBeanRegistry在生成单例后便不再持有对应的FactoryBean
BeanFactory:定义了Bean容器的基本查询接口,同时设定了以&前缀来区别工厂Bean,即如果beanName前面有&则返回对应Bean的工厂Bean对象而不是该Bean对象。
HierarchicalBeanFactory:在BeanFactory接口上增加了父子层级关系,以实现双亲委托。
ConfigurableBeanFactory:按照规矩,增加了修改功能的接口,同时增加了Scope特性,默认分为single单例和prototype多例。
AbstractBeanFactory:BeanFacoty的基本实现。
AbstractBeanFactory的getBean方法内部调用了doGetBean,该方法提供了根据beanName获取实例的具体实现,代码如下(删除了相关的注释和空格):
protectedT doGetBean( final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { /*(1)*/ final String beanName = transformedBeanName(name); Object bean; /*(2)*/ Object sharedInstance = getSingleton(beanName); /*(3)*/ 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 = getObjectForBeanInstance(sharedInstance, name, beanName, null); } /*(4)*/ else { /*(5)*/ if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); } /*(6)*/ BeanFactory parentBeanFactory = getParentBeanFactory(); if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { String nameToLookup = originalBeanName(name); if (args != null) { return (T) parentBeanFactory.getBean(nameToLookup, args); } else { return parentBeanFactory.getBean(nameToLookup, requiredType); } } /*(7)*/ if (!typeCheckOnly) { markBeanAsCreated(beanName); } try { /*(8)*/ final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); checkMergedBeanDefinition(mbd, beanName, args); /*(9)*/ String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dep : dependsOn) { if (isDependent(beanName, dep)) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'"); } registerDependentBean(dep, beanName); try { getBean(dep); } catch (NoSuchBeanDefinitionException ex) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", ex); } } } /*(10)*/ if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, new ObjectFactory