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

时间:2018-07-13 07:49:35

标签: java spring

我有一个如下的豆子,

 @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,从而导致空指针接收?

1 个答案:

答案 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");
    }
}