我有一个如下的豆子,
@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){...}
}
如果在普通类ConfigUtil之后初始化了Spring Bean SpringContextUtil,则它不正确。 因此,我想知道Spring如何确定较早初始化的是哪一个?例如,对SpringContextUtil.getActiveProfile()的调用会触发Spring bean的初始化吗?还是仅对Spring Bean进行了初始化,但尚未注入applicationContext,从而导致空指针接收?
答案 0 :(得分:1)
您只需要在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,则需要摆脱静态初始化块,而应在init方法上使用@PostConstruct
注释。
示例
@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");
}
}