6

我假设如果实例变量由 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);
    }

然后将其注入:

@Service("myService")
public class MyServiceImpl {

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

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

1 回答 1

14

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

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

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

于 2012-06-25T13:07:13.720 回答