【问题标题】:Autowired or new RetryTemplate自动装配或新的 RetryTemplate
【发布时间】:2018-10-12 06:13:37
【问题描述】:

在我的一个课程中,我想在SimpleRetryPolicyFixedBackOffPolicy 中使用带有特定参数的弹簧类RetryTemplateRetryTemplate 不是 bean,我考虑了两个选项:

  1. 在我的课堂上,像老式的一样,用 new () 不带任何 Autowired 来创建它。
  2. 在配置文件中将其创建为 Bean 并使其成为 Autowired。

更一般的问题是:我是否应该在配置文件中创建一个对象作为 Bean,即使它只是为了使用具有特定参数的特定类而创建的?

【问题讨论】:

    标签: java spring


    【解决方案1】:

    只需使用旧时尚方式的 new() 即可。如果您不在不同的类之间共享实例,并且您的此类不是“服务”或类似的东西,那么通过 spring 注入它是没有意义的。

    另一个(大的)区别是,如果您将其设为 bean,则默认情况下会使其成为单例,并将相同的实例注入到需要它的不同组件中。如果这不是必需的行为,那么您不需要使用该机制。我们仍在使用 java 进行编码,因此仅创建所需的对象没有任何问题。

    【讨论】:

      【解决方案2】:

      我会将它用作 bean。为什么?因为这样更容易测试您的服务,如果需要,您可以模拟这个 RetryTemplate bean,或者甚至,如果您使用带有上下文的测试,您可以定义测试 bean,它将替换您的真实 bean 来进行测试。

      它与你在 spring-boot 中使用 RestTemplateTestRestTemplate 的方法相同,当你运行测试时,spring 会自动创建 bean TestRestTemplate 这是 RestTemplate 的实现,扩展它并预先配置它更容易测试您的客户服务。

      仅使用 new 很难模拟它,以防万一。

      或者将来您可能想要添加另一个 RetryStrategy 并使用配置文件在它们之间切换,具体取决于您运行应用程序的环境。

      此外,您似乎不想为每个将使用它的服务创建RetryStrategy 的新副本,bean 默认是单例的,这意味着它将使用相同的实例(但是可以将其更改为为每个服务创建新实例,如果需要,它会自动装配)。

      总体而言,使用 bean 而非在 yuor 服务中创建实体对于未来的扩展和测试更加灵活。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-05
        • 2011-01-23
        • 2015-02-15
        • 1970-01-01
        • 1970-01-01
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多