大家好,我是北君。最近公司来了一个新实习生,很有干劲,天天追着我问问题。知背君开启了带实习生打怪升级之路。现在,今天我问了一个关于SpringProfiles的问题。实习生:知北先生,你知道SpringProfiles吗?知北君:知道了,怎么了?任何问题?实习生:那你能告诉我,SpringProfiles到底是什么?有什么用?知北君:嗯,Profiles是Spring框架的核心特性,可以让我们在不同的profile下对Springbeans有不同的配置实现。比如我们在production环节用prod来标记,那么我们的springbean构造完之后就会使用prod这个配置项。所以我们只要在启动时设置我们想要的profile,就可以得到不同的结果。实习生:那么这个SpringProfile在项目中是怎么使用的呢?知北君:好吧,我找个项目给你看。话音刚落,知北君就打开了IDEA,简单操作了一下,找到了一个配置类。@Component@Profile("dev")publicclassDevDatasourceConfig指北军:你见过吗?我们项目中的数据源配置类上有个@Profile注解,里面写了dev。也就是说这个配置类只有在profile=dev时才能生效。实习生:那这个就很简单了。知北君:对,用起来很简单,哦对了,这里有个小技巧。如果我们只是不想在特定的环境下配置某个配置类,也有一种很简单的操作方式。@Component@Profile("!dev")publicclassDevDatasourceConfig你看出区别了吗?实习生:刚刚添加了一个之前的开发!(感叹号)。没有其他变化。知北君:对,就是这样,这也是一个常用的技巧。实习生:虽然代码是这样配置的,但是你怎么知道项目启动的时候启用了哪个配置项呢?知北君:启用哪个配置,有很多种实现方式。1、我们可以直接在项目spring.profiles.active=dev2的application.properties文件中配置。硬编码实现WebApplicationInitializer接口,配置ServletContext激活配置}}3.直接在ConfigurableEnvironment中实现设置。使用springboot的朋友应该知道,系统中所有的配置项都是FromConfigurableEnvironment。@AutowiredprivateConfigurableEnvironmentenv;...env.setActiveProfiles("dev");4.命令行JVM启动参数-Dspring.profiles.active=dev5。exportspring_profiles_active=dev是通过exportenvironmentvariables来实现的嗯,我学会了这几种方法,你已经可以在大部分场景中轻松使用profile了。实习生:那我还有一个问题。如果是这样配置的,那么我的项目中就有多个profile。万一我手抖,用你说的配置不好吗?那么会发生什么?知北君:这个不用担心,springboot有自下而上的方法。想一想,有些项目不使用profile,springboot是怎么启动的呢?springboot项目会自动使用默认配置spring.profiles.default=none,也就是说springboot启动了,但是没有加载任何@Profile等标记的配置类,只会加载没有标记的配置类。实习生:知道了,我看到我们项目中,有很多@Profile("db")@Profile("mysql")之类的,那么这多个怎么用呢?知北君:对,在我们的项目中,不同的模块是分开配置的。让我举例说明如何使用它。-Dspring.profiles.active=dev,db,mysql是这样的,用逗号隔开,拼接在一起即可。实习生:那这个好像比较麻烦。错过了就是给自己挖坑。知北君:对,你要小心,因为你以前都是靠自己。现在不会有这个问题了,springboot团队也意识到了这个问题。从Springboot2.4开始支持分组。spring.profiles.group.production[0]=proddbspring.profiles.group.production[1]=prodmq我们平时启动的时候只需要指定spring.profiles.active=production,prodb和prodmq也可以配置成功.SpringProfiles的相关内容就差不多讲完了。你有任何问题吗?实习生:现在基本没有了,见面就来找你大哥。知北君:随时欢迎,我现在带你去,别为难我。哈哈哈。总结本文介绍了SpringProfiles的配置和使用,以及在启动时是否选择特定的profile。也讲述了一些使用过程中的小技巧,希望对你有所帮助。
