问题描述
假设我有一些名为 SomeClassConfig
的 Java 类,我想在其中定义如下所示的依赖项注入;
@Configuration
public class SomeClass {
@Bean
SomeOtherClass someOtherClass() {
FactoryClass factory = UtilFactoryClass.getDefaultFactory();
return factory.create();
}
}
这里UtilFactoryClass
表示一些库,它允许我创建一个工厂类,这反过来又允许我创建我感兴趣的对象的实例。我的问题是上面提到的默认工厂被初始化一段时间后,所以我希望在实例化默认 FactoryClass
实例后实例化/注入 bean。这可能吗? UtilFactoryClass
对 Spring Boot 框架一无所知,我尝试应用 @DependsOn 注解,但意识到它只允许我依赖其他 Bean。
我尝试应用的具体“getDefaultFactory”方法如下:Link。它与名为 Keycloak 的库相关联。我的问题是,从这个方法获得的工厂在应用程序生命周期的某个点之前都是空的。
解决方法
你的意思是:
@Configuration
public class SomeClass {
@Bean
SomeOtherClass someOtherClass() { //argument injection also possible
return factory().create();
}
@Bean
FactoryClass factory() {
//check/wait for condition e.g.:
while (!UtilityFactory.isInitialized()) {
try {
Thread.sleep(1000);
// better: TimeUnit.XXX.sleep(),and even better use an (spring managed) executor
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
return UtilFactoryClass.getDefaultFactory();
}
}
“让spring管理工厂”!? ;)
有关检查/等待部分,请参阅:https://www.baeldung.com/java-delay-code-execution