2010-05-13 91 views
0

我定义了一个类型为AnnotationSessionFactoryBean的bean的bean,以便在web-app中使用。AnnotationSessionFactoryBean和单例范围bean(Spring框架)

如果我没有明确地将其定义为NOT singleton,那么它必须是singleton。

现在,它被绑定到当前线程。

这意味着它不能是一个单身人士。

p.s. Factory生成的会话不是单例,SessionFactory一直是单例。现在一切都清楚了!

回答

2

AnnotationSessionFactoryBean(它的超类)定义了返回true的isSingleton()方法。所以这个工厂bean 返回的SessionFactory单身人士。

另一方面,SessionFactory生成的Session可能是线程绑定的。

所以,你必须:

BeanFactory creates SessionFactory creates Session 
+0

对,这只是一个工厂!春天把事情简化到这样的程度,有时候人们可能会错过这一点。谢谢。 – EugeneP 2010-05-13 08:06:00

1

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的单个实例可能在不同的线程交互的方式不同。

+0

真的吗?好的,这是一个复杂的对象。谢谢 – EugeneP 2010-05-13 08:09:36