gpt4 book ai didi

java - Spring如何决定初始化Bean和普通类的顺序?

转载 作者:行者123 更新时间:2023-12-02 11:01:01 25 4
gpt4 key购买 nike

我有一个如下的bean,

 @Component 
public class SpringContextUtil implements ApplicationContextAware {

private static ApplicationContext context = null;

@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.context = applicationContext;
}

public static <T> T getBean(String beanName) {
return (T) context.getBean(beanName);
}

public static String getActiveProfile() {
return context.getEnvironment().getActiveProfiles()[0];
}
}

它由普通类使用,

public class ConfigUtil
{
static{
String env = SpringContextUtil.getActiveProfile();
...
}

public static getVal(String key){...}
}

如果Spring Bean SpringContextUtil是在普通类ConfigUtil之后初始化的,那么就不行了。所以我想知道Spring如何决定哪一个先初始化?例如,SpringContextUtil.getActiveProfile()的调用会触发Spring bean的初始化吗?或者 Spring Bean 只被初始化,但尚未注入(inject) applicationContext,从而导致空指针异常?

最佳答案

您只需要在 spring 初始化后运行您的代码即可。

如果您使用的是 spring-boot,请创建实现 ApplicationListener<ApplicationReadyEvent> 的新 bean并在 onApplicationEvent 中运行您的代码方法。

示例

@Component
public class ApplicationListenerBean implements ApplicationListener<ApplicationReadyEvent> {

@Override
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
ConfigUtil.getVal("A");
}
}

但是如果你想制作ConfigUtil另外,作为 Spring bean,您需要摆脱静态初始化 block 并使用 @PostConstruct 来代替。您的 init 方法上的注释。

示例

@Component
@DependsOn("springContextUtil")
public class ConfigUtil {

private String env;

@PostConstruct
private void init() {
env = SpringContextUtil.getActiveProfile();
}


public static void getVal(String key) {
System.out.print("Hello");
}
}

关于java - Spring如何决定初始化Bean和普通类的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51320175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com