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

3
你好,我有一个任务需要调用一些初始化代码,这些代码需要使用一个名为config的bean,同时不暴露另一个会执行初始化的bean。到目前为止,我没有成功地做到这一点,除非使用初始化器bean。 用例CarFactory有一个静态的init方法,它有一个PartProvider参数,在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”方法。它产生一个nullObject bean。
@Bean
public Object notificationInit(final Config config) {
    CarFactory.init(new SeatProvider(config));
    return null;
}

我真正需要做的是在config可用的地方调用以下代码。
CarFactory.init(new SeatProvider(config));

1
如果Config是一个bean,您可以在其中使用@PostConstruct方法,并像CarFactory.init(new SeatProvider(this));一样调用它,但我不确定。 - undefined
1
在静态方法中,this.partProvider = partProvider; 无法编译通过。 - undefined
1个回答

2
这解决了我的问题,就像@michalk建议的那样。配置本身就是一个bean,我需要它。它获取注入的配置并在其@PostConstruct init()方法中运行初始化代码。
因此,配置作为一个bean可用,不需要初始化类。
@Configuration
public class AppConfiguration {

    @Inject
    private Config config;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接