动态获取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进行依赖注入,实现根据环境动态配置