1. 程式人生 > 實用技巧 >動態獲取jvm引數 Dspring.profiles.active

動態獲取jvm引數 Dspring.profiles.active

兩種方法

第一種

@Component
public class SpringContext implements ApplicationContextAware{

    private static ApplicationContext applicationContext;

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

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 通過name獲取 Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }

    /**
     * 通過class獲取Bean.
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public synchronized static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }

    /**
     * 通過name,以及Clazz返回指定的Bean
     *
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public synchronized  static <T> T getBean(String name, Class<T> clazz) {
        return applicationContext.getBean(name, clazz);
    }

    /// 獲取當前環境,該方法只有在容器啟動完成後可以呼叫
    public static String getActiveProfile() {
        Environment environment = applicationContext.getEnvironment();
        return environment.getActiveProfiles()[0];
    }

  這種方法最大的問題:實現ApplicationContextAware需要在spring容器建立成功過後才能呼叫

getActiveProfile,否則會報空指標。如果需要在容器啟動的時候,做一些特殊配置,這個方法就不適用了,可以用第二個方法

方法二:
@Configuration
@AutoConfigureOrder(0)
public class ProfileConfig {


    @Autowired
    private ApplicationContext context;

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

}

  用@Configuration,並且@AutoConfigureOrder(0)進行優先載入,那麼在別的一些@Configuration配置的時候就可以通過@Autowired進行依賴注入,實現根據環境動態配置