我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring 中如何根据环境切换配置 @Profile

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring 中如何根据环境切换配置 @Profile

Spring 根据环境切换配置 @Profile

我们实际开发中往往有多个环境,比如测试环境、开发环境、生产环境等;不同的环境往往配置也有区别,一直切换环境的配置很麻烦,Spring 为我们提供了一个注解,可以快速切换环境配置。

@Profile

我们新建一个配置,作用是注册三个数据源,因为不同的环境使用的数据库一般不一样:


@Configuration
@PropertySource("classpath:/person.properties")
public class MainConfigOfProfile implements EmbeddedValueResolverAware {
    @Value("${db.user}")
    private String user;
    @Value("${db.url}")
    private String url;
    private String driver;
    // 指定组件在那个环境下才能注册到组件中: 不指定则都能注册
    @Profile("test")
    @Bean("testDataSource")
    public DataSource dataSourceTest(@Value("${db.password}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl(url);
        dataSource.setDriverClass(driver);
        return dataSource;
    }
    @Profile("dev")
    @Bean("devDataSource")
    public DataSource dataSourceDev(@Value("${db.password}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl(url);
        dataSource.setDriverClass(driver);
        return dataSource;
    }
    @Profile("prod")
    @Bean("prodDataSource")
    public DataSource dataSourceProd(@Value("${db.password}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl(url);
        dataSource.setDriverClass(driver);
        return dataSource;
    }
    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        this.driver = resolver.resolveStringValue("${db.driver}");
    }
}

这里在方法上使用了 @Profile 注解来表示对应的环境,也就是说当指定环境之后,只有标注对应环境名的 Bean 才能被注册到容器中去,没有标注任何 @Profile 的方法默认直接注册进去。

环境区分好了如何启动对应的环境?

有两种方式:

  • 使用命令行参数;
  • 使用无参构造创建容器;

在 IDEA 中可以设置启动参数,加上如下参数:


-Dspring.profiles.active=test

其中 test 可以换成在 @Profile 中配置的名称。

这样就能指定环境启动了,还可以使用无参构造创建容器。


AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.getEnvironment().setActiveProfiles("prod", "dev");
context.register(MainConfigOfProfile.class);
context.refresh();

都是可以的,这里同时指定了两个环境:prod 和 dev。

@Profile 也可以放在类上,这样整个类就对应指定的环境名。

在 IDEA 中,还可以使用图形化界面快速切换所在的环境。

Spring配置profile,切换开发环境和测试生产环境

项目的开发环境和测试生产环境要配置的数据库,redis等等,连接地址都不一样。这样在项目部署到测试,生产时总要挨个修改这些配置。通过Spring的profile可以控制在不同的环境在Spring容器中注册不同的配置Bean,然后用一个总开关控制在什么环境用什么配置。


public interface CompactDisc {
    void play();
}

有两个类实现了它


public class MusicDisc implements CompactDisc {
    private String music = "菊花台";
    
    @Override
    public void play() {
        System.out.println(music);
    }
}
public class MovieDisc implements CompactDisc {
    private String MovieConfig = "泰坦尼克号";
    
    @Override
    public void play() {
        musicDisc.play();
    }
}

基于java配置


@Configuration
public class MusicConfig {
    @Bean
    @Profile("dev")
    public CompactDisc musicDisc(){
        return new MusicDisc();
    }
}
@Configuration
public class MovieConfig {
    @Bean
    @Profile("pro")
    public CompactDisc movieDisc(){
        return new MovieDisc();
    }
}

@Controller
public class DiscController {
    @Autowired(required=false)
    private CompactDisc disc;
    @RequestMapping("/disc")
    public String disc(){
        System.out.println("------进入controller--------");
        musicDisc.play();
        return "ewr";
    }
}

web.xml配置


<context-param>
        <param-name>spring.profiles.default</param-name>
        <param-value>dev</param-value>
    </context-param>
    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>pro</param-value>
    </context-param>
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/applicationContext.xml</param-value>
        </init-param>
        <init-param>
            <param-name>spring.profiles.default</param-name>
            <param-value>dev</param-value>
        </init-param>
        <load-on-startup> 1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

Controller类里有一个CompactDisc 的注入,由于上面MovieDisc 和MusicDisc 都实现了CompactDisc ,那么在Spring容器启动是就要选择一个注册,这个选择是通过@Profile(“pro”)注解标识的。然后通过在webxml里面添加spring.profiles.default控制

具体的控制规则如下:

xml里面配置了spring.profiles.default和spring.profiles.active,当没有active时默认defalult中配置的dev,对应配置类中@Profile(“dev”)标识的MusicDisc会被创建;当配置了active时,@Profile(“dev”)会被创建。未被@Profile标识的bean始终会被创建。所以根据上面的配置,当访问http://localhost:8080/Spring/disc 时输出是

------进入controller--------

泰坦尼克号

这样在部署不同的环境时通过控制spring.profiles.active和就ok了,而不必去一个一个的修改那些配置了。

xml配置方式


    <beans profile="pro">
        <bean id="compactDisc" class="com.xu.MusicDisc"></bean>
    </beans>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring 中如何根据环境切换配置 @Profile

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot 如何通过 Profile 实现不同环境下的配置切换

SpringBoot通过profile实现在不同环境下的配置切换,比如常见的开发环境、测试环境、生产环境,SpringBoot常用配置文件主要有 2 种:properties 文件和yml文件,本文给大家详细介绍SpringBoot 通过 Profile 实现不同环境下的配置切换,感兴趣的朋友一起看看吧
2022-11-13

如何配置etc/profile环境变量

这篇文章主要介绍“如何配置etc/profile环境变量”,在日常操作中,相信很多人在如何配置etc/profile环境变量问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何配置etc/profile环境变量
2023-06-10

Spring Boot + Mybatis + Spring MVC环境配置中DataSource如何配置

小编给大家分享一下Spring Boot + Mybatis + Spring MVC环境配置中DataSource如何配置,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解
2023-06-02

UBUNTU中如何配置LAMP环境

这篇文章主要介绍“UBUNTU中如何配置LAMP环境”,在日常操作中,相信很多人在UBUNTU中如何配置LAMP环境问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”UBUNTU中如何配置LAMP环境”的疑惑有所
2023-07-04

eclipse中java环境如何配置

要在Eclipse中配置Java环境,您可以按照以下步骤进行操作:1. 下载并安装JDK(Java Development Kit):访问Oracle官方网站(https://www.oracle.com/java/technologies
2023-09-08

IDEA中如何配置Node环境

这篇文章主要介绍了IDEA中如何配置Node环境的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇IDEA中如何配置Node环境文章都会有所收获,下面我们一起来看看吧。一、下载Node.js官网下载链接:Node.
2023-07-05

SpringCloud Config配置中心原理及环境切换方式是什么

本文小编为大家详细介绍“SpringCloud Config配置中心原理及环境切换方式是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringCloud Config配置中心原理及环境切换方式是什么”文章能帮助大家解决疑惑,下面跟
2023-06-29

Linux中如何修改~/.bashrc或/etc/profile设置环境变量

目录简介什么是环境变量怎么设置环境变量.bashrc这里直接一个图带你看懂子目录下的.bashrc文件bashrc与profile的区别总结简介 在虚拟机linux系统上装一些软件经常会碰到需要自己设置环境变量的情况,Windows上装过A
2023-05-05

如何在windowns中配置PySpark环境

如何在windowns中配置PySpark环境?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先需要下载hadoop和spark,解压,然后设置环境变量。hadoop清华源下载
2023-06-15

在VScode中如何配置ROS环境

本篇内容主要讲解“在VScode中如何配置ROS环境”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在VScode中如何配置ROS环境”吧!准备工作首先在VScode中安装ROS和catkin_t
2023-07-02

Linux中如何配置环境变量

这篇文章主要介绍Linux中如何配置环境变量,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!下面所有例子的环境说明如下:系统:Ubuntu 14.0用户名:uusama需要配置MySQL环境变量路径:/home/uus
2023-06-27

Window环境下如何配置Mongodb数据库

这篇文章主要介绍“Window环境下如何配置Mongodb数据库”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Window环境下如何配置Mongodb数据库”文章能帮助大家解决问题。一、下载我选择的
2023-07-02

如何在Nest.js中配置环境变量

这篇文章主要介绍了如何在Nest.js中配置环境变量,此处给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值,需要的朋友可以参考下:环境变量配置简述程序在不同的环境下需要不同的环境变量,例如生产环境、测试环境以及开发环境所需要不同的
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录