【问题标题】:Creating multiple objects for spring boot best practice为 Spring Boot 最佳实践创建多个对象
【发布时间】:2019-11-23 02:22:36
【问题描述】:

我正在使用 spring boot。请在我的场景中提出最佳实践。

我有带参数的人员类-:
姓名、地址、性别、公司工作、年龄、职业等。

这些参数我将从另一个系统作为 personDTO 对象接收,该对象将作为 post 请求进入正文

所以我正在编写一个创建人 api。这里我不能使用 spring bean,因为它是单例的,并且一次可以有多个请求。(get/post 参考下面的注释3)

所以 create api 函数将在 func 下面调用。 请建议通过利用 Spring Boot 功能而不是使用 new Person 来创建多个对象的最佳方法

注意-:1)我在数据库中保存人员类。
注意-:2)我在 body 参数中使用 personDto 对象,因为相同的 dto 对象用于在项目中创建其他类,这些类将为其他类提供额外的参数。所以不要专注于 personDto 类。
注意3-:我不能使用单例,因为可以说有人正在使用get api,然后因为它是单例的,所以它会与它返回错误的参数相矛盾。因此使用新的。

void createPerson(personDto pDto)
{
   Person p = new Person();
   p.setName(pDto.getName());
   P.setAge(pDto.getAge());
   p.setSex(pDto.getSex());
   .
   "like this and opening transaction session to rollback if object is not 
   created"
}

【问题讨论】:

  • 我不能使用 spring bean,因为它是单例的,一次可以有多个请求。:这是你错的地方。单例完全能够同时处理多个请求。它需要是线程安全的,仅此而已。但控制器通常是无状态的,因此是线程安全的。
  • 我不能使用单例,因为可以说有人正在使用 get api,然后因为它是单例的,所以它会矛盾,它会返回错误的参数。因此使用了新的。
  • 我没有完全理解你的问题。你究竟需要得到什么答案?是否有更好的方法来创建“数据对象”(Person)而不是使用new Person(...)
  • 是的,通过利用 spring boot 功能而不是使用 new Person 创建多个对象的最佳方法
  • 我不能使用单例,因为可以说有人正在使用 get api,然后因为它是单例的,所以它会矛盾,它会返回错误的参数:不,它不会。每个线程都有自己的堆栈,一个线程中一个方法执行所使用的局部变量不会与另一个线程中相同方法执行所使用的其他局部变量相同。而且每个线程都需要创建一个新人,所以使用new Person()是正确的,正确的做法。

标签: java spring-boot


【解决方案1】:

显然,Person 不能是单例,因为您可以根据每个请求创建这些对象,这是可以理解的。 现在,如果您绝对需要它,您可以在 Spring 中将 Person 创建为具有原型范围的 bean。

将 PersonDTO 转换为 Person 的服务将是一个单例,如 cmets 中所述,但它的“convert”方法可以获得原型。

有许多技术方法可以将原型注入单例。看看Here

但是,我想强调的是,与单例不同,原型范围的 bean 实例不存储在应用程序上下文中。否则,应用程序上下文会爆炸,保留太多引用(我的意思是内存不足错误)

所以你将获得以下基本信息:

  • 春天会做一个“新”而不是你
  • 如果已定义,则可以调用 Post Construct(但对于 pre-destroy 方法则不然)
  • 如果你在这个类中有依赖,spring 会为你注入它们。在像你这样的对象转换的情况下似乎不是这种情况。

那么此时使用 Spring 有什么意义呢?

就个人而言(这只是我的意见/建议)倾向于在 Spring 之外处理各种转换者、构建者等,将服务/控制器(长期存在的对象)保留在 Spring 中。

【讨论】:

  • 感谢您的帮助!但是如果我在对象创建中涉及依赖注入,那么我也应该使用 new 或 alllow spring 来创建对象。
  • 是的,当然,这正是我回答中的第三个项目符号......但我的印象是这样的转换不会强加任何 DI 使用(Person 类没有依赖项).. .
  • 没有人的类有地址类。那么我应该使用原型吗?
  • 地址也可能在不同的人之间发生变化......它是创建 Person 对象的一部分。所以在这种情况下,我仍然认为你不应该选择 spring...
  • 但是prototype[person class] 会处理依赖注入,所以应该没有问题,好像我让person prortotype address 也将是prototype(意味着新的address 对象被添加到person 类)。just想知道为什么不春天
猜你喜欢
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2021-03-03
相关资源
最近更新 更多