在 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 之后调用PartProvider
bean 可用。 CarFactory
和 SeatProvider
来自依赖项,无法更改。
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));
}
}
你好,我的任务是调用一些需要一个 bean (config
) 的初始化代码,而不暴露另一个将执行初始化的 bean。到目前为止,如果没有初始化程序 bean,我无法完成此操作。
用例:CarFactory
有一个静态 ìnit
方法,它有一个 PartProvider
作为参数,应该在 a 之后调用PartProvider
bean 可用。 CarFactory
和 SeatProvider
来自依赖项,无法更改。
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));
}
}