我已经看到它在很多地方写过,Spring应用程序的DAO和Service类应该是 singleton 作用域。
在我的应用程序中,我有以下服务类
@Service
public class CustomerServiceImpl implements CustomerService {
@Autowired
private CustomerDAO customerDAO;
.......
parameterised methods only....
}
和DAO类
@Repository
public class CustomerDAOImpl implements CustomerDAO {
@Autowired
private SessionFactory sessionFactory;
...............
parameterised methods only....
}
由于我没有定义任何范围,因此默认范围是singleton.So CustomerService和CustomerDAO将仅按容器实例化一次。此外,DAO类将在开始时仅自动连接到Service类一次。由于它将是一个 重要请求 Web应用程序,这意味着( OR 表示?)< em>数百个线程将使用两个类的相同实例。
那么在这种情况下如何保证线程安全? 那么在xml中定义的hibernate sessionfactory bean的范围呢?
我对spring mvc应用程序中的bean范围和线程安全性感到非常困惑。 Springsource文档没有为Web应用程序清楚地解释这些内容。
有人可以向我解释使用bean作用域(对于DAO,服务,控制器和其他bean)来处理繁重的请求Web应用程序的最佳实践吗? 解释这些woulb的任何链接都要感激我。
提前感谢您的建议。
答案 0 :(得分:3)
只要您的服务和DAO单例不保持状态(不保存实例变量 - 其他bean除外 - 操作内部方法),线程安全没有问题。
关于会话在工厂中,spring web-app中的默认hibernate会话范围基于“每个请求一个hibernate会话”模式,这意味着每个http请求(线程)将有一个会话,因此没有理由不担心并发。