使用Spring的线程安全,无状态设计

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

@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); } } 

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

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

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