spring Sql Session FactoryBen作成Sql Session Factory

4628 ワード

Apple.xml

  
  
Sql Session Factoryを作成します.
ApplicationContext ctx = new ClassPathXmlApplicationContext("APPLICATION.xml");
SqlSessionFactory sqlSessionFactory=(SqlSessionFactory) ctx.getBean("sqlSessionFactory");
なぜ戻ってきたのかはSql Session FactoryオブジェクトではなくSql Session FactoryBen最初のspringです.初期化時に作成したすべての例をsingleton ObjectにMapの形で入れます.同時にFactoryBenのgetObject()を呼び出して、戻ってくる対象をMapの形でfactory Beabject Cache Cacheに入れます.
sql Session Factory=org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@d997f9)
そしてgetBenの場合、springはgetSingletonを利用してsingleton Objectから単例を取得し(ここはSql Session FactoryBenオブジェクト)、FactoryBenインターフェースが実現されたかどうかを判断し、実現すればfactoryBenObject Cacheからbeannameを利用して、ここではsql Session Factoryの新規Factoryを取得することができません.
初期化のソースコードは複雑で、整理できません.以下はgetBeanのソースコードだけです.
1、まず呼出しするのはClass PathXml Apple Compection Controtext父類AbstractReflashable Application Contectの親類Abstract Appration ControtextのgetBenです.
	public Object getBean(String name) throws BeansException {
		return getBeanFactory().getBean(name);
	}
2、AbstractRefreshable Applectoryを呼び出したget BenFactory()Configrable Listable BenFactoryインターフェースに戻り、DefaultListable BeanFactoryを実現します.
	
@Override(   AbstractApplicationContext getBeanFactory    )
	public final ConfigurableListableBeanFactory getBeanFactory() {
		synchronized (this.beanFactoryMonitor) {
			if (this.beanFactory == null) {
				throw new IllegalStateException("BeanFactory not initialized or already closed - " +
						"call 'refresh' before accessing beans via the ApplicationContext");
			}
			return this.beanFactory;
		}
	}
3、DefaultListable BenFactoryを呼び出した親類AbstractBenFactoryのゲビーン()
	
public Object getBean(String name) throws BeansException {
		return doGetBean(name, null, null, false);
	}
4、AbstractBenFactoryを呼び出すドGetBen()
	
protected  T doGetBean(
			final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly)
			throws BeansException {

		final String beanName = transformedBeanName(name);
		Object bean;

		// Eagerly check singleton cache for manually registered singletons.
		Object sharedInstance = getSingleton(beanName);//  bean      
		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);
		}
5、AbstractBenFactoryを呼び出すgetObject ForBenInstance()は、FactoryBeanインターフェースが実現されているかどうかを判断し、実現されていない場合は、前のステップに戻って作成された一例を返します.
	
protected Object getObjectForBeanInstance(
			Object beanInstance, String name, String beanName, RootBeanDefinition mbd) {

		// Don't let calling code try to dereference the factory if the bean isn't a factory.
		if (BeanFactoryUtils.isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {
			throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
		}

		// Now we have the bean instance, which may be a normal bean or a FactoryBean.
		// If it's a FactoryBean, we use it to create a bean instance, unless the
		// caller actually wants a reference to the factory.
		if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
			return beanInstance;
		}//      FactoryBean  

		Object object = null;
		if (mbd == null) {
			object = getCachedObjectForFactoryBean(beanName);// factoryBeanObjectCache   FactoryBean     
		}
		if (object == null) {
			// Return bean instance from factory.
			FactoryBean factory = (FactoryBean) beanInstance;
			// Caches object obtained from FactoryBean if it is a singleton.
			if (mbd == null && containsBeanDefinition(beanName)) {
				mbd = getMergedLocalBeanDefinition(beanName);
			}
			boolean synthetic = (mbd != null && mbd.isSynthetic());
			object = getObjectFromFactoryBean(factory, beanName, !synthetic);
		}
		return object;
	}