在大多数情况下,只有服务类由spring管理并且是单例。在某些情况下,域代码需要注入,除非由spring管理,否则它将无法工作。话虽如此,建议将所有域类作为@bean,并将范围作为原型并随时随地进行
,这是明智的和非性能密集型的。Person p = new Person();
只是做
Person p = ctx.getBean("person");
任何有关利弊的帮助将不胜感激。
答案 0 :(得分:0)
获取原型bean显然比直接通过new关键字直接实例化(Spring IoC容器执行的任何依赖注入,生命周期回调等)有更多的开销。虽然对于单个实例化可能并不重要,但如果您在循环中执行此操作,则可能会发现性能问题。
但是,如果您需要任何单件bean(通常是服务)或资源(例如DataSource),那么您更愿意使用原型bean。任何其他依赖项将自动连接。
除了性能方面的考虑,您的选择也可能取决于您的设计。如果您遵循“传统”架构,其中包含服务层和数据访问对象,那么从Spring角度来看,一切都是无状态的。您的服务和数据访问对象是使用POJO的域对象的单例。在这里,您很少需要原型bean。
另一方面,如果您遵循更加面向对象的方法,其中对象具有无状态工厂(允许获取或创建实例),则对象可以自行保留(例如使用“保存”方法),然后几乎所有的域对象都可能是原型bean。
正如几乎所有的决定一样,会有权衡,没有一个正确的答案。