【问题标题】:AnnotationSessionFactoryBean and singleton scoped bean (Spring framework)AnnotationSessionFactoryBean 和单例作用域 bean(Spring 框架)
【发布时间】:2010-05-13 16:08:21
【问题描述】:

我定义了一个 AnnotationSessionFactoryBean 类型的 bean 用于 web-app。

如果我没有明确定义为NOT单例,那它一定是单例的。

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

这意味着它不能是单例。

附言Factory 生成的 Session 不是单例,而 SessionFactory 始终是单例。现在一切都清楚了!

【问题讨论】:

    标签: java hibernate spring session


    【解决方案1】:

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

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

    所以你有:

    BeanFactory creates SessionFactory creates Session
    

    【讨论】:

    • 对,那只是一个工厂! Spring 将问题简化到了有时人们可能会忽略重点的程度。谢谢。
    【解决方案2】:

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

    【讨论】:

    • 真的吗?是的,它是一个复杂的对象。谢谢
    猜你喜欢
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2020-11-09
    • 1970-01-01
    相关资源
    最近更新 更多