java后端判断当前环境是生产环境还是开发环境的方式不少,比如通过main方法的调试参数来区分。这里我通过判断springboot激活的配置文件后缀来区分,首先介绍如何根据应用环境不同激活不同后缀的配置文件。
1:新建2个配置文件分别是开发环境(dev)配置与生成环境(prod)配置:
2:在主配置文件application.yml中声明默认启用的配置文件:
启动应用时如果需要指定生产环境在启动命令后加上 --spring.profiles.active=prod即可(如:java -Xms100m -jar
xx.war --spring.profiles.active=prod &)。
以上就是springboot便捷切换配置文件,接着我们看代码中如何判断当前的环境。
1:编写一个类用来保存springboot应用上下文对象的引用,此类也可用来在非spring管理类下获取springBean。
2:在springboot启动类的main方法中将spring上下文对象set进我们新建的类
3:保存上下文对象的同时拿到我们激活的配置文件后缀名
4:拿到了激活的配置文件后缀,基本就完成了,我们可以基于此写一个判断当前是否为开发环境的方法:
完整代码,附带手动获取bean,手动获取配置值,获取当前请求:
public class SpringUtil { private static ApplicationContext
applicationContext; //0-2表示开发,测试,生产环境 private static byte environ = 0; public
static void setApplicationContext(ApplicationContext context) {
SpringUtil.applicationContext = context; //获取当前的系统环境 Environment evn =
applicationContext.getEnvironment(); String[] activeProfiles =
evn.getActiveProfiles(); for (String profile : activeProfiles) { if
("dev".equals(profile)){ break; } else if ("test".equals(profile)){ environ =
1; break; } else if ("prod".equals(profile)){ environ = 2; break; } }
callbackAfterRunning(); } public static ApplicationContext
getApplicationContext() { return applicationContext; } //获取配置文件配置值 public
static String getEvnProperty(String key){ return
applicationContext.getEnvironment().getProperty(key); } //通过bean名称获取bean public
static Object getBeanByName(String name){ try { return
getApplicationContext().getBean(name); } catch (Exception e){ return null; } }
public static Object getBeanByClassName(String className){ try{ Class aClass =
Class.forName(className); Object obj = getApplicationContext().getBean(aClass);
return obj; }catch(Exception ex){ return null; } } public static <T> T
getBean(Class<T> clazz) { if (SpringUtil.applicationContext == null) { return
null; } try { return SpringUtil.applicationContext.getBean(clazz); } catch
(Exception e){ return null; } } //当前是否为开发环境 public static boolean isDev() {
return environ == 0; } //是否为测试环境 public static boolean isTest(){ return environ
== 1; } //是否为生产环境 public static boolean isProd(){ return environ == 2; }
///获取当前环境 public static byte getEnviron(){ return environ; } //获取当前请求 public
static HttpServletRequest currentRequest(){ ServletRequestAttributes
servletRequestAttributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes(); return
servletRequestAttributes.getRequest(); } private static void
callbackAfterRunning(){ TimeZone.setDefault(
TimeZone.getTimeZone("Asia/Shanghai") ); } }
该方式判断环境也是有一定局限性,只能在spring项目中使用。