zoukankan      html  css  js  c++  java
  • SpringBoot使用@Profile指定运行环境

    SpringBoot使用@Profile指定运行环境

    实际开发中我们需要为不同的环境做不同的配置,如下图:

    1.application.yml

    application.yml是默认使用的配置文件,在其中通过spring.profiles.active设置使用哪一个配置文件,下面代码表示使用application.prod.yml配置,如果application.prod.yml和application.yml配置了相同的配置,比如都配置了运行端口,那application.prod.yml会覆盖application.yml的配置

    #需要使用的配置文件
    spring:
      profiles:
        active: prod
        #spring.profiles.include属性用来设置无条件的激活哪些profile
        #include: prod 
    
    

    2. VM options、Program arguments、Active Profile

    VM options设置启动参数 -Dspring.profiles.active=prod
    Program arguments设置 --spring.profiles.active=prod
    Active Profile 设置 prod
    这三个参数不要一起设置,会引起冲突,选一种即可,如下图

    3. 命令行

    将项目打成jar包,在jar包的目录下打开命令行,使用如下命令启动:

    java -jar spring-boot-profile.jar --spring.profiles.active=prod
    

    上面是profile在配置文件上的应用,同时profile还可以用在类上,spring提供了@Peofile注解可以实现不同环境下配置参数的切换,任何@Component或@Configuration注解的类都可以使用@Profile注解。

    我们可以在配置类上使用@Profile注解,如下,该配置只会在prod环境下生效

    @Configuration
    @Profile("prod")
    public class ProductionConfiguration {
        // ...
    }
    

    如果在实现类上加上@Profile注解,则可以实现注入接口时根据当时的配置环境动态注入对应的实现类。下面是一个例子:
    有一个HelloService接口

    package com.along.service;
    
    public interface HelloService {
        String hello();
    }
    

    对HelloService接口做了两个实现,分别对应于生产环境和开发环境,如下

    package com.along.service;
    
    import org.springframework.context.annotation.Profile;
    import org.springframework.stereotype.Service;
    
    /**
     * 生产环境实现类
     */
    @Service
    @Profile("dev")
    public class DevServiceImpl implements HelloService {
    
        @Override
        public String hello() {
            return "use dev";
        }
    }
    
    package com.along.service;
    
    import org.springframework.context.annotation.Profile;
    import org.springframework.stereotype.Service;
    
    /**
     * 开发环境实现类
     */
    @Service
    @Profile("prod")
    public class ProdServiceImpl implements HelloService {
    
        @Override
        public String hello() {
            return "use prod";
        }
    }
    

    然后写一个接口调用HelloService

    package com.along.controller;
    
    import com.along.service.HelloService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {
    
        @Autowired
        private HelloService helloService;
    
        @RequestMapping("hello")
        public String sayHello(){
            return helloService.hello();
        }
    }
    

    当前启用的配置环境是prod,application.yml配置如下

    spring:
      profiles:
        active: prod
    

    启动项目,浏览器访问http://localhost:8082/hello,接口返回use prod,再改变application.yml配置,启用dev,重启项目,再次访问接口返回use dev,说明@Profile注解起到了作用,实现了根据当时的配置环境动态的选择相应的实现类。

  • 相关阅读:
    Dockerfile 构建前端node应用并用shell脚本实现jenkins自动构建
    Nginx自定义404页面
    shell脚本逐个杀死k8s中某个应用的pod
    阿里云容器镜像加速器配置
    jenkins shell脚本自动化构建阿里云k8s上应用
    在容器服务kubernetes上配置https
    docker build 指定dockerfile
    centos 7 系统启动不了 出现报错dependency failed for /mnt , dependency failed for local file systems
    向Kubernetes集群删除Node
    SharePoint 2013 关于自定义显示列表表单的bug
  • 原文地址:https://www.cnblogs.com/cnsyear/p/13229678.html
Copyright © 2011-2022 走看看