【问题标题】:what is the point of defining beans in spring boot?在 Spring Boot 中定义 bean 有什么意义?
【发布时间】:2019-10-18 13:49:49
【问题描述】:

我在 Java 和 Spring Boot 领域还很陌生,所以一些显而易见的事情对我来说可能并不那么明显。我希望这个问题适合stackoverflow...

我有一个 Spring Boot 服务,它有一些开放的 REST API 控制器和一些与这些控制器交互的服务类。一些服务类调用外部 REST API。

我使用 RestTemplate 调用外部 REST api。
我的问题是:
为什么我必须创建一个 bean

    //resttemplate so that we can autowire it inside services
    @Bean 
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        // Do any additional configuration here
        return builder.build();
    }

然后在我的服务中

    @Autowired
    private RestTemplate restTemplate = new RestTemplate();

我也可以将它与自动装配一起使用,然后我就不必创建一个 bean...

没有创建 bean @autowired 对我来说失败了。

【问题讨论】:

  • 答案就在问题中:为了能够自动装配 bean,必须定义 bean。所以,如果你不创建bean,由于Spring Boot没有提供默认的RestTemplate bean,你需要自己创建。如果你想知道为什么 Boot 不提供默认的 RestTemplate bean:docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…
  • 包含restTemplate()方法的类必须注解@Configuration

标签: java spring spring-boot


【解决方案1】:

如果您不想,您没有将 RestTemplate 创建为 bean。您的应用程序将进行的每个类似的远程 Http 调用都应该有一个 RestTemplate。

例如,如果您的应用程序正在对 Facebook API 进行远程 Http 调用,并且您希望针对响应制定特定的缓存策略,您将使用自定义 ClientHttpRequestFactory 创建一个 RestTemplate。如果您的应用程序还必须在需要不同缓存策略或身份验证方法的情况下调用 GitHub API,您可能会有另一个带有自己的 ClientHttpRequestFactory 的 RestTemplate。

但是,如果您的应用程序只有标准的远程 Http 调用而无需自定义它们,您可以为整个应用程序创建一个 RestTemplate 并将其作为 bean 公开(就像您所做的那样)。如果您不想那样做,并且希望每个服务都有自己的 RestTemplate,只需删除 bean 声明并从服务中删除 @Autowired。然后该服务将拥有自己的 RestTemplate。

注意:您也可以使用RestTemplate restTemplate = new RestTemplateBuilder().build(); 对 RestTemplate 进行更多自定义。

【讨论】:

    猜你喜欢
    • 2016-09-10
    • 2021-07-27
    • 1970-01-01
    • 2019-08-10
    • 2017-04-24
    • 2019-10-03
    • 2017-06-21
    • 1970-01-01
    • 2017-09-12
    相关资源
    最近更新 更多