我定义了一个类型为AnnotationSessionFactoryBean的bean的bean,以便在web-app中使用。AnnotationSessionFactoryBean和单例范围bean(Spring框架)
如果我没有明确地将其定义为NOT singleton,那么它必须是singleton。
现在,它被绑定到当前线程。
这意味着它不能是一个单身人士。
p.s. Factory生成的会话不是单例,SessionFactory一直是单例。现在一切都清楚了!
我定义了一个类型为AnnotationSessionFactoryBean的bean的bean,以便在web-app中使用。AnnotationSessionFactoryBean和单例范围bean(Spring框架)
如果我没有明确地将其定义为NOT singleton,那么它必须是singleton。
现在,它被绑定到当前线程。
这意味着它不能是一个单身人士。
p.s. Factory生成的会话不是单例,SessionFactory一直是单例。现在一切都清楚了!
AnnotationSessionFactoryBean
(它的超类)定义了返回true的isSingleton()
方法。所以这个工厂bean 返回的SessionFactory
是单身人士。
另一方面,SessionFactory
生成的Session
可能是线程绑定的。
所以,你必须:
BeanFactory creates SessionFactory creates Session
的AnnotationSessionFactoryBean
称为LocalSessionFactoryBean
超类有一些ThreadLocal<?>
静态字段:
private static final ThreadLocal<DataSource> configTimeDataSourceHolder =
new ThreadLocal<DataSource>();
private static final ThreadLocal<TransactionManager> configTimeTransactionManagerHolder =
new ThreadLocal<TransactionManager>();
private static final ThreadLocal<Object> configTimeRegionFactoryHolder =
new ThreadLocal<Object>();
private static final ThreadLocal<CacheProvider> configTimeCacheProviderHolder =
new ThreadLocal<CacheProvider>();
private static final ThreadLocal<LobHandler> configTimeLobHandlerHolder =
new ThreadLocal<LobHandler>();
所以即使这个bean的单个实例可能在不同的线程交互的方式不同。
真的吗?好的,这是一个复杂的对象。谢谢 – EugeneP 2010-05-13 08:09:36
对,这只是一个工厂!春天把事情简化到这样的程度,有时候人们可能会错过这一点。谢谢。 – EugeneP 2010-05-13 08:06:00