java - Web应用程序中的Spring SimpleThreadScope : part of container pool?

标签 java spring web-applications

拥有公开加密功能的服务。我们不需要清理,也不希望每次/每次 session 都创建对象。但我需要每个线程一个单独的对象。

在 Web 应用程序中 - 范围是 Web 容器的线程池吗?

spring 3 和 4 的实现是一样的吗?

我们计划使用它的另一个地方是缓存 SimpleDateFormat 对象。同样不需要清理方法。

最佳答案

从 3.0 版开始,Spring 就有了线程作用域的基本概念:SimpleThreadScope。看起来它可以满足您的要求,但它有一些限制:

  • 默认情况下它不会在容器中注册,但必须明确注册
  • 它不会对其 Bean 执行清理操作。

如果您可以适应这些限制,则可以通过编程方式注册范围:

Scope threadScope = new SimpleThreadScope();
appContext.getBeanFactory().registerScope("thread", threadScope);

或者在 xml 配置中:

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
            <entry key="thread">
                <bean class="org.springframework.context.support.SimpleThreadScope"/>
            </entry>
        </map>
    </property>
</bean>

这在 Spring 3 和 Spring 4 中是一样的。如果你想在单例 bean 中注入(inject)一个线程范围的 bean,你必须在它上面声明一个 aop 范围的代理:

<bean id="bar" class="x.y.Bar" scope="thread">
    <property name="name" value="Rick"/>
    <aop:scoped-proxy/>
</bean>
<bean id="foo" class="x.y.Foo">
    <property name="bar" ref="bar"/>
</bean>

(所有示例均来自 Spring 框架引用文档)。

如果你必须做一些清理,你可以看看这个文档 Spring by Example Custom Thread Scope Module显示了 SimpleThreadScope 的增强版本。

但我不确定您是否真的想要这样,除非所有线程都连续使用线程作用域 bean,否则内存并不是真正的问题。因为在该设计模式中,如果一次只有一个 session 需要该 bean,但它由多个线程提供服务(假设其他请求不需要该 bean),则所有线程都将获得该 bean 的不同实例,而使用池中只会使用一个实例。

您将在 SO How to pool objects in Spring? 的另一篇文章中找到将 CommonsPoolTargetSource 与 Apache Common Pools 一起使用的示例。 。帖子摘录:

<bean id="simpleBeanTarget" class="com.bean.SimpleBean" scope="prototype"/>

<bean id="poolTargetSource" class="org.springframework.aop.target.CommonsPoolTargetSource">
    <property name="targetBeanName" value="simpleBeanTarget" />
    <property name="maxSize" value="2" />
</bean>

<bean id="simpleBean" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="targetSource" ref="poolTargetSource" />
</bean>

该示例使用 ProxyFactoryBean 提供 aop 代理,以允许在单例 bean 中注入(inject) simpleBean(前提是将其作为接口(interface)注入(inject))。

关于java - Web应用程序中的Spring SimpleThreadScope : part of container pool?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24290976/

相关文章:

java - GridBagConstraints ipad 锁定大小

java - 将 spring/hibernate 数据源的 xml 和 java 配置组合为 AWS RDS

spring - @Scheduled 线程是否终止?

ios - 备用图标 - 禁用图标更改警报(更新)

java - Java Web 应用程序中的静态用法

java - 使用多个着色器

java - json:引用

java - SAXBuilder jdom 给出异常

java - Spring中是先创建bean还是先通过构造函数创建实例

eclipse - 无法使用 Tomcat 启动欢迎页面