Java 将原型与单例混合

Java 将原型与单例混合,java,spring,design-patterns,Java,Spring,Design Patterns,我在Spring中有一些应用程序,它可以根据每个请求(从工厂)创建原型BeanX。这个bean X有一些DAO单例,例如Y、Z和我工作的某个对象(设置值等) 这是正确的方法吗?我的意思是,在每个请求中,Spring容器都必须搜索这些单例bean并将它们注入到原型中,这样有效吗?或者,最好创建无状态bean并在适当的方法中创建某个对象实例,然后在我想使用它时将其传入函数参数中(这不太舒服)?最好使用单例作用域和无状态bean,因为无状态bean是线程安全的。只有在不能使用无状态时才使用statef

我在Spring中有一些应用程序,它可以根据每个请求(从工厂)创建原型BeanX。这个bean X有一些DAO单例,例如Y、Z和我工作的某个对象(设置值等)


这是正确的方法吗?我的意思是,在每个请求中,Spring容器都必须搜索这些单例bean并将它们注入到原型中,这样有效吗?或者,最好创建无状态bean并在适当的方法中创建某个对象实例,然后在我想使用它时将其传入函数参数中(这不太舒服)?

最好使用单例作用域和无状态bean,因为无状态bean是线程安全的。只有在不能使用无状态时才使用statefull bean。

我假设
someMethod()
将有效地使用
y
z
?(你能更正代码吗:
X
在类中应该是
Y
)。是的,someMethod()有效地使用Y和z为obj生成一些数据。更正。但是
SomeObject
只是
X
的内部状态,它在对
X
的不同方法的不同调用之间保持某种状态,还是从
X
外部可见?是的,从外部可见。是的,我知道,但是在“Clean code”系列的每本书中都提到尽可能多地使用实例变量,因为它使代码更可读,并且在需要更改对象时,不需要在每个方法中传递对象(例如,如果我们有10个方法怎么办?在每个方法中,我们必须在方法定义中有某个对象变量)。这使得SpingBean读起来非常糟糕,但可以肯定的是,线程安全,所有规则都有一个scope=)实例变量对于具有复杂逻辑的类来说是一个很好的解决方案。但服务(或其他构建块,如数据访问对象)应该是无状态的。您可以组合这些规则并在非spring helper类中使用实例变量,然后在singleton服务中创建此类的局部变量实例。
@Scope(value="prototype")
public class X{
   @Autowired 
   private Y y;
   @Autowired
   private Z z;

   private SomeObject obj;

   public void someMethod(){
   obj.setProperty();
   }
}