使⽤spring.profiles.active来分区配置的⽅法⽰例
很多时候,我们项⽬在开发环境和⽣成环境的环境配置是不⼀样的,例如,数据库配置,在开发的时候,我们⼀般⽤测试数据库,⽽在⽣产环境的时候,我们是⽤正式的数据,这时候,我们可以利⽤profile在不同的环境下配置⽤不同的配置⽂件或者不同的配置
spring boot允许你通过命名约定按照⼀定的格式(application-{profile}.properties)来定义多个配置⽂件,然后通过在application.properyies通过spring.profiles.active来具体激活⼀个或者多个配置⽂件,如果没有没有指定任何profile的配置⽂件的话,spring boot默认会启动application-default.properties。
profile的配置⽂件可以按照application.properyies的放置位置⼀样,放于以下四个位置,
1.当前⽬录的 “/config”的⼦⽬录下
2.当前⽬录下
3.classpath根⽬录的“/config”包下
4.classpath的根⽬录下
在这⾥我们就定义俩个profile⽂件,application-cus1.properties和application-cus2.properties,并在俩个⽂件中都分别写上变量cusvar=cus1和cusvar=cus2
我们在application.properyies也写上,并把profile切换到application-cus1.properties的配置⽂件
cusvar=cus3
spring.profiles.active=cus1
可以通过这样⼦来测试
@RestController
@RequestMapping("/task")
public class TaskController {
@RequestMapping(value = {"/",""})
public String hellTask(@Value("${cusvar}")String cusvar ){
return "hello task !! myage is " + cusvar;
}
}
在这⾥可以看到spring.profiles.active激活的profile不同,打印出来的结果也不⼀样。
除了可以⽤profile的配置⽂件来分区配置我们的环境变量,在代码⾥,我们还可以直接⽤@Profile注解来进⾏配置,例如数据库配置,这⾥我们先定义⼀个接⼝
public interface DBConnector {
public void configure();
}
分别定义俩个实现类来实现它
/**
* 测试数据库
*/
@Component
@Profile("testdb")
public class TestDBConnector implements DBConnector {
@Override
public void configure() {
System.out.println("testdb");
}
}
/**
* ⽣产数据库
*/
@Component
@Profile("devdb")
public class DevDBConnector implements DBConnector {
@Override
public void configure() {
System.out.println("devdb");
}
}
通过在配置⽂件激活具体使⽤哪个实现类
spring.profiles.active=testdb
然后就可以这么⽤了
@RestController
@RequestMapping("/task")
public class TaskController {
@Autowired DBConnector connector ;
@RequestMapping(value = {"/",""})
public String hellTask(){
return "hello task !! myage is " + myage;
}
}
除了spring.profiles.active来激活⼀个或者多个profile之外,还可以⽤spring.profiles.include来叠加profile
spring.profiles: testdb
spring.profiles.include: proddb,prodmq
以上就是spring boot⽤profile的作⽤
通过命令⾏设置属性值
相信使⽤过⼀段时间Spring Boot的⽤户,⼀定知道这条命令:java -jar xxx.jar --server.port=8888,通过使⽤--server.port属性来设置xxx.jar应⽤的端⼝为8888。
在命令⾏运⾏时,连续的两个减号--就是对application.properties中的属性值进⾏赋值的标识。所以,java -jar xxx.jar --server.port=8888命令,等价于我们在application.properties中添加属性server.port=8888,该设置在样例⼯程中可见,读者可通过删除该值或使⽤命令⾏来设置该值来验证。
通过命令⾏来修改属性值固然提供了不错的便利性,但是通过命令⾏就能更改应⽤运⾏的参数,那岂不是很不安全?是的,所以Spring Boot也贴⼼的提供了屏蔽命令⾏访问属性的设置,只需要这句设置就能屏蔽:
SpringApplication.setAddCommandLineProperties(false)。
多环境配置
以上都不是重点,这才是重点,这才是重点,这才是重点,重要的事情说3遍。我们在开发Spring Boot应⽤时,通常同⼀套程序会被应⽤和安装到⼏个不同的环境,⽐如:开发、测试、⽣产等。其中每个环境的数据库地址、服务器端⼝等等配置都会不同,如果在为不同环境打包时都要频繁修改配置⽂件的话,那必将是个⾮常繁琐且容易发⽣错误的事。
对于多环境的配置,各种项⽬构建⼯具或是框架的基本思路是⼀致的,通过配置多份不同环境的配置⽂件,再通过打包命令指定需要打包的内容之后进⾏区分打包,Spring Boot也不例外,或者说更加简单。
在Spring Boot中多环境配置⽂件名需要满⾜application-{profile}.properties的格式,其中{profile}对应你的环境标识,⽐如:
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:⽣产环境
⾄于哪个具体的配置⽂件会被加载,需要在application.properties⽂件中通过spring.profiles.active属性来设置,其值对应{profile}值。
如:spring.profiles.active=test就会加载application-test.properties配置⽂件内容
下⾯,以不同环境配置不同的服务端⼝为例,进⾏样例实验。
针对各环境新建不同的配置⽂件application-dev.properties、application-test.properties、application-prod.properties
在这三个⽂件均都设置不同的server.port属性,如:dev环境设置为8080,test环境设置为9090,prod环境设置为80
application.properties中设置spring.profiles.active=dev,就是说默认以dev环境设置
测试不同配置的加载:
执⾏java -jar xxx.jar,可以观察到服务端⼝被设置为8080,也就是默认的开发环境(dev)
执⾏java -jar xxx.jar --spring.profiles.active=test,可以观察到服务端⼝被设置为9090,也就是测试环境的配置(test)
执⾏java -jar xxx.jar --spring.profiles.active=prod,可以观察到服务端⼝被设置为80,也就是⽣产环境的配置(prod)
按照上⾯的实验,可以如下总结多环境的配置思路:
application.properties中配置通⽤内容,并设置spring.profiles.active=dev,以开发环境为默认配置
application-{profile}.properties中配置各个环境不同的内容
通过命令⾏⽅式去激活不同环境的配置。
多环境⾼级应⽤
在某些情况下,应⽤的某些业务逻辑可能需要有不同的实现。例如邮件服务,假设EmailService中包含的send(String email)⽅法向指定地址发送电⼦邮件,但是我们仅仅希望在⽣产环境中才执⾏真正发送邮件的代码,⽽开发环境⾥则不发送以免向⽤户发送⽆意义的垃圾邮件。
我们可以借助Spring的注解@Profile实现这样的功能,这样需要定义两个实现EmailService借⼝的类:
/**
* 发送邮件接⼝.
*/
public interface EmailService {
/**发送邮件*/
publicvoid send();
}
发送邮件的具体实现(dev-开发环境的代码):
@Service
@Profile("dev") //开发环境的时候.
public class DevEmailServiceImpl implements EmailService{
@Override
publicvoid send() {
System.out.println("DevEmailServiceImpl.send().开发环境不执⾏邮件的发送.");
}
}
发送邮件的具体实现(prod-⽣产环境的代码):
@Service
@Profile("prod") //⽣产环境.
public class ProdEmailServiceImpl2 implements EmailService{
@Override
publicvoid send() {
System.out.println("DevEmailServiceImpl.send().⽣产环境执⾏邮件的发送.");
//具体的邮件发送代码.
//mail.send();
spring怎么读取配置
}
}
@Profile("dev")表明只有Spring定义的Profile为dev时才会实例化DevEmailService这个类。那么如何设置Profile呢?
在配置⽂件中指定
在application.properties中加⼊:
spring.profiles.active=dev
通过命令⾏参数
java -jar app.jar --spring.profiles.active=dev
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。