spring Sql Session FactoryBen作成Sql Session Factory
4628 ワード
Apple.xml
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です.
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;
}