java - 使用 Spring 的线程安全、无状态设计

标签 java spring thread-safety scalability stateless

我假设如果实例变量由 spring IOC 管理,并且是单例,那么设计可以称为无状态和线程安全的。这种类型的设计因此可以扩展到集群服务器。下面概述的我的假设是否正确?

@Repository("myDao")
public class MyDao implements Dao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Value("${sqlFoo}")
    private String foo;

    @Override
    public Integer getMyInt(String str) {
      return jdbcTemplate.queryForInt(foo, str);
    }

然后注入(inject):

@Service("myService")
public class MyServiceImpl {

    @Resource(name = "myDao")
    Dao dao;

    @Override
    @Transactional(readOnly = true)
    public int getScore(String str) {
      return dao.getMyInt(str);
    }
}

最佳答案

Spring bean 不是无状态的,因为它们有状态(字段)。从技术上讲,它们甚至不是不可变的,因为您可以随时更改注入(inject)的字段。

但是,您可以通过使用 final 字段和构造函数注入(inject)轻松地使 Spring bean 不可变。从可扩展性的角度来看,这种状态也没有问题。如果您的 bean 包含随时间变化的可变值,那么这是集群时的主要问题。但是在 Spring 中,服务通常只包含在引导时注入(inject)的依赖项。因此,它们实际上是无状态且不可变的。

运行同一个 Spring 应用程序的服务器数量无关紧要 - bean 和依赖项本身是安全的。 但是如果您的 Spring bean 包含计数器、缓存、可变映射等 - 您需要考虑它们。

关于java - 使用 Spring 的线程安全、无状态设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11189907/

相关文章:

spring - 使用resttemplate从xml解码对象时出现错误

java - Java socket 多线程安全吗?

java - 如何使用List类型的参数声明具有相同函数名的不同方法

java - JNLP 打开太多连接并导致 BindException : Address already in use

用于 mini-max 算法的 Java 动态树

java - 如何将包含 < 字符的字符串属性注入(inject) Spring bean?

java - 合并两个段落对象

java - 在 JUnit 测试中将 Maven 属性传递给 Spring 应用程序上下文文件

java - 与具有无限循环的线程(可调用)相结合

python - 将 SQLalchemy 与 gevent 一起使用是否安全?