【问题标题】:Customize auto-configured Spring Boot Bean自定义自动配置的 Spring Boot Bean
【发布时间】:2015-02-10 15:51:00
【问题描述】:

我正在使用 Spring Boot,并且在很大程度上只是为大多数组件使用了自动配置选项。但是,我发现了一些实例,我只是希望与 Bean 的行为略有不同。

执行此操作的最佳/建议方法是什么?在许多情况下,我不想为了更改 bean 上的一个属性而关闭自动配置,所以希望有某种方法可以明智地更新 bean 属性?

我的情况是DispatcherServlet - 我对autoconfig 很满意,但我只想更改我的DispatcherServlet,所以DispatchOptionsRequest 设置为true。我希望我不需要关闭自动配置并在本地复制配置只是为了调用该 setter 方法?

【问题讨论】:

  • 仅供参考:我提交了PR 以通过属性进行配置。它应该有望在 Spring Boot 1.3.0 发布时提供。

标签: java spring spring-boot


【解决方案1】:

可以通过声明一个名为dispatcherServletDispatcherServlet 类型的bean 来配置调度程序servlet,然后返回一个配置为您喜欢的实例。这将覆盖之前的声明。

例子:

@Bean
public DispatcherServlet dispatcherServlet() {
    DispatcherServlet servlet = new DispatcherServlet();
    servlet.setDispatchOptionsRequest(true);
    return servlet;
}

【讨论】:

  • 酷 - 所以只要将任何 bean 命名为与 spring autoconfig 中定义的 bean 相同的名称,它就会始终覆盖它?如果我对其他 bean 采用这种方法,有什么我应该注意的吗?还是 spring-boot 保证这种行为?
  • @rhinds 这就是大部分自动配置的工作方式。 Spring Boot 参考文档非常值得一读。
  • @chrylis 我已经阅读了大部分文档,但没有看到这一点 - 看到了 re: disabling the autoconfig 和各种 Conditional.. 注释的内容 - 但这些情况都与这里无关(虽然它很长!所以可能只是错过了这一点:)。此外,如果您看到 autoConfig 类的链接源代码 - DispatcherServlet bean 方法实际上用于初始化同一静态内部类中的另一个 bean (DispatcherServletRegistration) - 看看它如何仍然适用于我的重写 Bean 方法?
  • 对于许多bean来说都是如此,例如DispatcherServlet,但在使用Spring Cache抽象时说CacheManager就不是这样了。在这种情况下,配置类应该实现某个接口,并且实现方法的返回引用会覆盖默认值。
  • 谢谢@zrvan - 在这种情况下,查看自动配置源,如果我只是替换 DispatcherServlet bean,我假设 DefaultDispatcherServletCondition 将返回负数,这样整个内部静态类就不会运行?在这种情况下,我还需要手动配置定义的另外两个 bean? (这就是我要问的是否可以避免:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 2020-02-02
相关资源
最近更新 更多