Spring Boot 2 - 在@Configuration 之前加载@Component

Posted

技术标签:

【中文标题】Spring Boot 2 - 在@Configuration 之前加载@Component【英文标题】:Spring Boot 2 - @Component loading before @Configuration 【发布时间】:2021-08-19 22:27:59 【问题描述】:

我有一个 Spring Boot 应用程序和两个来自我正在使用的不同 jar 的类,其中一个是 @Component,另一个是 @Configuration。 它们都有@PostConstruct 方法,基本上这是我的用例-> 我希望@Configuration 的@PostConstruct 在@Component 的@PostConstruct 之前运行。有没有可能以某种方式实现这一目标? 我尝试在@Component 上使用@DependsOn(引用@Configuration - 里面没有任何bean - 只有@PostConstruct),但它不起作用。 这是代码片段。 第一个文件:

@Configuration
public class MainConfig 
    @PostConstruct
    public void postConstruct() 
        // doSomething
    

第二个文件。

@Component
public class SecondClass 
  @PostConstruct
  public void init() throws InterruptedException 
    // doSomething that depends on postConstruct from MainConfig
   

提前非常感谢

【问题讨论】:

我从未见过带有后期构造例程的配置对象.. @mre 这在技术上是允许的,但相同;没见过。这是混合职责。 我对你在MainConfig::postConstruct 所做的事情非常感兴趣。虽然你可以做到,但这可能是非常错误的。 【参考方案1】:
@Configuration
public class MainConfig 

    public void postConstruct() 
        // doSomething
    



@Component
public class SecondClass 

  @Autowired
  private MainConfig mainConfig;

  @PostConstruct
  public void init() throws InterruptedException 
    mainConfig.postConstruct();
    // doSomething that depends on postConstruct from MainConfig
   

【讨论】:

这个不一样,你这里当然是在不同的地方触发了一个方法。 这解决了我的问题,基本上如果你自动装配配置 Spring 将在调用 SecondClass 方法上的 PostConstruct 之前初始化配置。我还找到了解决这个问题的另一种方法,我将主配置的包添加到我的应用程序的 ComponentScan 中,这也有效 @AleksandarT 我不会依赖spring post-construct方法的顺序,除非spring文档明确保证。它可能适用于您的情况,但在生产环境或任何其他版本的 spring 或 java 中可能会有所不同。

以上是关于Spring Boot 2 - 在@Configuration 之前加载@Component的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot + Websocket

Spring Batch with Spring boot - 配置 JobRepositoryFactoryBean

spring boot之入门配置

在 Spring Boot 中使用令牌保护 api

Spring Boot 整合Swagger 第二部 (动态配置启动Swagger,API分组管理)

SpringBoot中@EnableAutoConfiguration注解用法收集