在 Spring 启动时调用需要一个 bean 的静态 init 方法,而不暴露另一个 bean

Call static init method that needs a bean on Spring startup, without exposing another bean

你好,我的任务是调用一些需要一个 bean (config) 的初始化代码,而不暴露另一个将执行初始化的 bean。到目前为止,如果没有初始化程序 bean,我无法完成此操作。

用例CarFactory 有一个静态 ìnit 方法,它有一个 PartProvider 作为参数,应该在 a 之后调用PartProviderbean 可用。 CarFactorySeatProvider 来自依赖项,无法更改。

import javax.inject.Inject;

public abstract class CarFactory {

    private static PartProvider partProvider;

    private CarFactory() {
    }

    @Inject
    public static void init(final PartProvider partProvider) {
        PartProvider.partProvider = partProvider;
    }
}
public class SeatProvider implements PartProvider {

    Config config;

    @Inject
    public SeatProvider(@NonNull Config config) {
        this.config = config;
   }

}

我当前公开初始化程序 bean 的代码

初始化器 bean


public class FactoryInitializer implements InitializingBean {

    private PartProvider partProvider

    @Inject
    public FactoryInitializer(PartProvider partProvider) {
        this.partProvider = partProvider;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        CarFactory.init(provider);
    }
}

配置


@Configuration
public class AppConfiguration {

    @Bean
    public FactoryInitializer factoryInitializer(final Config config) {
        return new FactoryInitializer(new SeatProvider(config));
    }
}

这是一个丑陋但有效的 'hack'。这会产生一个 Object bean,即 null.

@Bean
public Object notificationInit(final Config config) {
    CarFactory.init(new SeatProvider(config));
    return null;
}

我真正需要做的是在 config 可用的地方调用以下代码。

CarFactory.init(new SeatProvider(config));

这按照@michalk 的建议解决了我的问题。无论如何,配置是我需要的 bean 本身。它获取配置并在其 @PostConstruct init() 方法中运行初始化代码。

所以配置作为 bean 可用,不需要初始化程序 class。

@Configuration
public class AppConfiguration {

    @Inject
    private Config config;

    @PostConstruct
    public void init() throws Exception {
        CarFactory.init(new SeatProvider(config));
    }
}