【问题标题】:Spring Boot - Prioritize Bean Creation Order from External JarSpring Boot - 优先考虑外部 Jar 中的 Bean 创建顺序
【发布时间】:2021-08-31 15:20:53
【问题描述】:

我有以下自动配置的类,列在EnableAutoConfiguration 下的spring.factories 中,并打包为公共库:

@Configuration
public class GracefulShutdownConfig {

    @Bean
    public GracefulShutdown gracefulShutdown() {
        return new GracefulShutdown();
    }

    @Bean
    public WebServerFactory webServerFactory(final GracefulShutdown gracefulShutdown) {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers(gracefulShutdown);
        return factory;
    }
}

当作为 jar 库导入时,bean 初始化太晚,此时 TomcatServletWebServerFactory 已经启动了 Tomcat,添加了 connectorCustomizers 并向它们注入了 Connector

因此,GracefulShutdown 类没有收到它的Connector 并抛出 NullPointerException。

我已阅读 solutions 关于如何在自动配置的类中优先考虑自动配置的类,但在我的情况下,我希望我的自动配置类的 bean 在 Spring Boot 本身启动时优先加载,因为 bean 与其他外部注入的 bean 无关或不依赖。有人可以帮忙吗?

【问题讨论】:

  • @AutoConfigureBefore 似乎正是您在这里所需要的(尽管我也希望确认默认引导行为不会应用您的自定义程序,如果您只是将其注册为 bean;这是一种相当常见的模式)。
  • 我将这个添加到我的配置类中:@AutoConfigureOrder(-2147483648) @AutoConfigureBefore({ServletWebServerFactoryAutoConfiguration.class, EmbeddedWebServerFactoryCustomizerAutoConfiguration.class}) 但是,仍然没有效果。

标签: java spring spring-boot


【解决方案1】:

解决方案是使用@AutoConfigureBefore

@AutoConfigureBefore,当在Spring自动配置类ServletWebServerFactoryAutoConfiguration上使用时,它负责TomcatServletWebServerFactory的实例化,允许我们在工厂创建其定义之前注册自己的TomcatServletWebServerFactoryBeanDefinition

解决办法如下:

@Configuration
@AutoConfigureBefore(value = {ServletWebServerFactoryAutoConfiguration.class})
public class GracefulShutdownConfig {

    @Bean
    public GracefulShutdown gracefulShutdown() {
        return new GracefulShutdown();
    }

    @Bean
    public TomcatServletWebServerFactory webServerFactory(final GracefulShutdown gracefulShutdown) {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers(gracefulShutdown);
        return factory;
    }
}

这里有两个来源帮助我找到了正确的方向:

【讨论】:

  • 这很奇怪。如果删除 @DependsOn 导致失败,则说明有问题(在您的配置中或可能在 Boot 中),因为上下文应该从方法参数中自动识别依赖项。
  • 如果我删除 DependsOn,它仍然可以工作,谢谢,显然我没有测试这个最终组合。但是,如果我删除它并返回 WebServerFactory 的超类型而不是 TomcatServletWebServerFactory,我的连接器不会被注入到我的类中,无论我是否有 DependsOn。这对我来说很奇怪,但我会把它留在那里。
猜你喜欢
  • 1970-01-01
  • 2019-12-25
  • 2019-04-03
  • 2016-01-19
  • 2022-06-17
  • 2015-06-16
  • 2017-02-19
  • 2016-07-05
  • 2018-06-26
相关资源
最近更新 更多