【问题标题】:Standard Scope for Spring classesSpring 类的标准范围
【发布时间】:2022-02-05 18:49:57
【问题描述】:

在 Spring MVC 应用程序中,默认情况下所有 bean 都是单例的,但根据良好的编程实践,以下类的标准范围应该是什么:

1.DAO 类

2.控制器类

3.DTO 类

4.服务类

我已经读过 DAO 和 Controller 类应该是单例范围的,而 DTO 类不应该是 bean,所以没有注释,在需要时,应该使用“new”来实例化 DTO 类。

@Service 类的范围是什么?

如果在这两个范围内都没有创建上述类,哪些类将具有 Request 和 Session 范围?

【问题讨论】:

    标签: spring spring-mvc singleton javabeans scopes


    【解决方案1】:

    首先不是类,而是 Spring 管理的 bean 有一个范围。不同之处在于您可以在应用程序中拥有未配置为由 Spring 管理的类(例如,您没有提供 @Component 注释)

    对于 Spring 托管 bean,默认范围是 Singleton。这意味着每次您要求自动装配该 bean 时,Spring 容器都会提供相同的实例。

    您可以使用例如@Scopeannotation 更改该默认范围。因此,要回答您的问题,上述所有选项的默认范围都是单例,但您可以根据需要将其更改为 requestsessionscope(但仅适用于 Web 应用程序)。您可以阅读有关设置范围的更多信息here

    ps。 DTO 类通常不会被声明为由 Spring 管理 - 让 Spring 管理一个简单的数据传输对象没有多大意义。

    【讨论】:

    • 嗨,我已经编辑了我的问题,我知道所有bean的默认范围都是单例的,我的问题是根据不同类型的bean分配范围的标准是什么,哪些bean是合适的在 web 应用程序上下文中请求和会话范围。 @Service bean 最适合的范围是什么
    • 标准用例是单例,有时有会话范围是有用的,例如购物车 bean,这样添加到购物车的项目在用户会话期间保留在那里,这非常很少需要任何其他范围。
    【解决方案2】:

    所以这里基本上要考虑两件事。第一个是,如果需要将 bean 声明为 spring bean 。这取决于您是否需要使用此类的 spring 功能,例如 @Transactional@Async@PreAuthorize@Autowired (即依赖注入),或者确保 bean 具有一定的范围等。如果没有,它更简单,不要将其定义为spring bean,只需自己创建即可。

    所以在大多数情况下需要以下类型的类来将它们定义为spring bean:

    • DAO 因为很可能需要向其注入 EntityManagerJdbcTemplate
    • 控制器,因为它是 spring-mvc 的一部分,您需要将其定义为 bean,以便您可以使用 @RequestMapping / @GetMapping / @PostMapping / @PutMapping / @DeletMapping / @PatchMapping等关于它的方法。
    • Service 类,因为您需要将其注入到控制器中,并且您需要使用@Transactional 为其方法管理 DB 事务。

    对于 DTO ,大多数情况下你可以自己创建它,因为它本质上只是一个数据容器,不需要使用任何 spring 特性。

    要考虑的第二件事是 bean 应该是什么范围。您主要需要考虑该类的实例是否可以被多个请求(即线程)同时安全地执行。如果是,您可以简单地使用默认的单例范围。如果没有,您可以考虑是否希望每个 HTTP 请求(即@RequestScope)或每个 HTTP 会话(即@SessionScope)都有自己的该类实例可以使用。例如,如果您正在实现一些购物车,您很可能希望 HTTP 会话拥有他们赢得的购物车实例,因此您应该使用 @SessionScope 作为购物车。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多