2010-05-13 3 views
0

Я определяю компонент типа AnnotationSessionFactoryBean для использования в веб-приложении.AnnotationSessionFactoryBean и singleton scobe bean (Spring framework)

Если я не определяю это явно как single single, он должен быть singleton.

Теперь он связан с текущей резьбой.

Это означает, что он не может быть синглом.

p.s. Сессия, созданная Factory, не является синглом, SessionFactory, с другой стороны, всегда является синглом. Теперь все ясно!

ответ

2

AnnotationSessionFactoryBean (его суперкласс) определяет метод isSingleton(), который возвращает true. Таким образом, SessionFactory, возвращенный этой фабрикой bean is singleton.

С другой стороны, Session, который производит SessionFactory, может быть связан с потоком.

Так у вас есть:

BeanFactory creates SessionFactory creates Session 
+0

Право, это только ЗАВОД! Весна упрощает дело до такой степени, что иногда можно пропустить это. Благодарю. – EugeneP

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>(); 

Так что даже один экземпляр данного компонента может взаимодействовать по-разному в разных потоках.

+0

действительно? Ну да, это сложный объект. спасибо – EugeneP

Смежные вопросы