7

我在很多地方都看到过,Spring 应用程序的 DAO 和服务类应该是单例范围的。
在我的应用程序中,我有以下服务类

@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....
}  

因为我没有定义任何范围,所以默认范围是单例的。所以 CustomerService 和 CustomerDAO 将只在每个容器中实例化一次。此外,DAO 类将在开始时仅自动连接到服务类一次。因为它是这将是一个请求繁重的Web 应用程序,这意味着(或者这是否意味着数百个线程将使用这两个类的相同实例。

那么在这种情况下如何保证线程安全呢?
那么xml中定义的hibernate sessionfactory bean的范围呢?

我对 spring mvc 应用程序中的 bean 范围和线程安全感到非常困惑。Springsource 文档没有为 Web 应用程序清楚地解释这些。

任何人都可以向我解释使用 bean 范围(用于 DAO、Service、Controller 和其他 bean)来处理重请求 Web 应用程序的最佳实践吗?
任何解释这些的链接都会感谢我。

提前感谢您的建议。

4

1 回答 1

5

只要您的服务和 DAO 单例不保持状态(不保持实例变量 - 其他 bean 除外 - 在方法内部操作),线程安全就没有问题。

关于会话工厂,spring web-app 中默认的休眠会话范围基于“每个请求一个休眠会话”模式,这意味着您将为每个 http 请求(线程)拥有一个会话,因此无需担心并发性两者都不。

于 2013-04-02T11:49:06.787 回答