默认情况下,Spring创建的Bean是singleton。它们是线程安全的,因为它们是无状态的。当我们希望Spring创建有状态Bean时,我们需要使用原型范围来定义Bean。我们需要为他们处理线程安全问题。当原型bean注入时,所有无状态Bean都将被污染。所以,我只是无法想象我们可以在哪里使用原型范围。你能给出一些我们可以/需要使用原型Spring Bean的典型场景吗?另外,我们怎样才能消除其他单一豆类的状态污染?
答案 0 :(得分:14)
使用原型范围的原因有很多,例如,任何时候使用“new”而不是使用单例。每个用户bean,每个请求bean,一个独特的bean集合等等。毕竟,在任何非平凡的应用程序中,你不是使用非单身人士而不是单身人士吗?
单例范围的bean不是线程安全的,因为它们是单例 - 它们必须写才是线程安全的。它们不会神奇地变得线程安全。 bean的范围就是它的范围:它不会使bean 适合特定范围 - 这取决于开发人员。
答案 1 :(得分:1)
我认为原型范围的bean可以替代用于创建对象的工厂类。不同之处在于原型bean spring会为您节省一些依赖注入的代码,并且在适当的时候也会自动代理您的对象以进行交易等。
我自己更喜欢工厂方法。我遇到的原型范围的一个合理方案是有状态对象,由不同的已知bean需要,每个都需要自己的副本。在这种情况下,专用工厂类将是多余的,因为我不需要动态创建对象,但仅在其他bean实例化期间。