Spring Profile与PropertyPlaceholderConfigurer项目多环境配置切换

 更新时间:2023年09月11日 15:39:30   作者:回炉重造P  
这篇文章主要介绍了Spring Profile与PropertyPlaceholderConfigurer项目多环境配置切换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

最近考虑项目在不同环境下配置的切换,使用profile注解搭配PropertyPlaceholderConfigurer实现对配置文件的切换,简单写了个demo记录下实现。

基本知识介绍

@Profile

@Profile 通过对bean进行修饰,来限定spring在bean管理时的初始化情况,只有环境中激活的profile状态和修饰的value值对应时,该bean才会被顺利加载并管理。

PropertyPlaceholderConfigurer

PropertyPlaceholderConfigurer 是PlaceholderConfigurerSupport的实现类,是spring提供的一个解析yml或properties配置文件并将对应的值进行映射,通过 ${} 形式进行调用的配置读取类。

举例来说,配置文件中 akb.num=48 ,那么在bean或配置文件中使用 ${akb.num} 即可获取配置的值48。

简单实现

profile修饰的bean实例在不同环境下的切换

首先定义bean接口与default、dev、prob三种情况下的bean。

接口 DeafultProfileBean

@Component
public interface DefaultProfileBean {
    String getInfo();
}

default bean ProfileBeanDefault

@Profile("default")
@Component
public class ProfileBeanDefault implements DefaultProfileBean{
    @Override
    public String getInfo() {
        return "这是default状态下的bean";
    }
}

dev bean ProfileBeanDev

@Profile("dev")
@Component
public class ProfileBeanDev implements DefaultProfileBean{
    @Override
    public String getInfo(){
        return "这是dev环境使用的bean";
}
}

dev bean ProfileBeanProd

@Profile("prod")
@Component
public class ProfileBeanProd implements DefaultProfileBean{
    @Override
    public String getInfo() {
        return "这是prod环境使用的bean";
}
}

加载上下文并输出加载的bean结果

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        // 设置profile环境
        context.getEnvironment().setActiveProfiles("dev");
        context.scan("com.huiluczP");
        context.refresh();
        System.out.println("loading success");
        DefaultProfileBean bean = context.getBean(DefaultProfileBean.class);
        System.out.println(bean.getInfo());

切换profile环境后的不同输出结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以看出@Profile注解生效了。

配置类和配置文件

SpringConfigure 配置类

@Configuration
public class SpringConfigure {
    @Bean
    @Profile("default")
    // 默认状态配置加载类
    public PropertyPlaceholderConfigurer defaultConfig(){
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        Resource resource = new ClassPathResource("config/default.properties");
        ppc.setLocation(resource);
        return ppc;
    }
    @Bean
    @Profile("dev")
    // dev状态配置加载类
    public PropertyPlaceholderConfigurer devConfig(){
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        Resource resource = new ClassPathResource("config/dev.properties");
        ppc.setLocation(resource);
        return ppc;
    }
    @Bean
    @Profile("prod")
    // prod状态配置加载类
    public PropertyPlaceholderConfigurer prodConfig(){
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        Resource resource = new ClassPathResource("config/prod.properties");
        ppc.setLocation(resource);
        return ppc;
    }
}

管理了三个 PropertyPlaceholderConfigurer 类型的配置读取类,分别对应不同的profile状态。通过 ClassPathResource 读取对应的配置文件,如果用xml配置文件进行PropertyPlaceholderConfigurer bean的管理,直接增加property location,将value设置为对应的配置文件地址即可。

三个不同的配置文件内容

default.properties

config.info=default information

dev.properties

config.info=dev information

prod.properties

config.info=prod information

配置获取测试接口和bean类

public interface DefaultConfigBean {
    String getConfigInfo();
}
@Component
public class DifferentConfigBean implements DefaultConfigBean{
    @Value("${config.info}")
    private String config;
    @Override
    public String getConfigInfo() {
        return "当前环境下的config信息为:" + config;
    }
}

通过 ${config.info} 实现对配置文件的获取。

加载上下文进行处理

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        // 设置profile环境
        context.getEnvironment().setActiveProfiles("prod");
        context.scan("com.huiluczP");
        context.refresh();
        DefaultConfigBean configBean = context.getBean(DefaultConfigBean.class);
        System.out.println(configBean.getConfigInfo());

切换环境输出结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

profile激活

特别的,说明下对项目profile环境怎么进行设置以对profile进行激活。没有特别指定时,默认调用default修饰的bean。

1.直接上下文设定,也就是上文中使用的,对enviroment中的 activeProfile 进行设置即可。

2.web项目中可以在web.xml中设置全局的变量:

<context-param>
        <param-name>spring.profiles.alive</param-name>
        <param-value>dev</param-value>
</context-param>

3.如果是springMVC管理,可以在DispatcherServlet的配置中增加init-param:

<init-param>
    <param-name>spring.profiles.alive</param-name>
    <param-value>dev</param-value>
</init-param>

4.可以在jvm的运行属性中设置,tomcat等服务器的启动option也可设置jvm属性。

-Dspring.profiles.active=dev

5.对测试类使用注解 @ActiveProfiles 进行修饰,value设置为对应的环境。 总结

简单记录了一下spring profile和PropertyPlaceholderConfigurers类实现不同环境下的不同配置文件加载的方法,在分支中进行快速切换还是挺方便的,而且PropertyPlaceholderConfigurer映射的配置在spring读取其他的配置文件时也可以通过${}进行读取,这样不同的环境配置文件只需要一份,并将其中需要变动的部分用PropertyPlaceholderConfigurer进行管理即可。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于SpringBoot加载Mybatis的TypeAlias问题

    基于SpringBoot加载Mybatis的TypeAlias问题

    这篇文章主要介绍了解决SpringBoot加载Mybatis的TypeAlias问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • springboot集成本地缓存Caffeine的三种使用方式(小结)

    springboot集成本地缓存Caffeine的三种使用方式(小结)

    本文主要介绍了springboot集成本地缓存Caffeine的三种使用方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • java父子节点parentid树形结构数据的规整

    java父子节点parentid树形结构数据的规整

    这篇文章主要介绍了java父子节点parentid树形结构数据的规整,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java源码解析重写锁的设计结构和细节

    Java源码解析重写锁的设计结构和细节

    这篇文章主要为大家介绍了Java源码解析重写锁的设计结构和细节,这小节我们以共享锁作为案列,自定义一个共享锁。有需要的朋友可以借鉴参考下
    2022-03-03
  • GraphQL入门总体创建教程

    GraphQL入门总体创建教程

    这篇文章主要为大家介绍了GraphQL入门总体创建教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Mybatis用注解写in查询的实现

    Mybatis用注解写in查询的实现

    这篇文章主要介绍了Mybatis用注解写in查询的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 学习Java模拟实现百度文档在线浏览

    学习Java模拟实现百度文档在线浏览

    这片文章介绍了如何使用Java模拟实现百度文档在线浏览,文章思路清晰,需要的朋友可以参考下
    2015-07-07
  • Spring Boot ORM 框架JPA使用与连接池 Hikari详解

    Spring Boot ORM 框架JPA使用与连接池 Hikari详解

    这篇文章主要介绍了SpringBoot ORM框架JPA与连接池Hikari,主要就是介绍JPA 的使用姿势,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • Maven设置JDK版本的两种方法实现

    Maven设置JDK版本的两种方法实现

    本文主要介绍了Maven设置JDK版本的两种方法实现,是通过Apache Maven Compiler Plugin插件实现的,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • IntelliJ IDEA2022中的Java文档注释设置、操作方法

    IntelliJ IDEA2022中的Java文档注释设置、操作方法

    这篇文章主要介绍了IntelliJ IDEA2022中的Java文档注释设置、操作详述,本文通过图文并茂的方式给大家介绍IDEA2022 文档注释设置方法,需要的朋友可以参考下
    2022-08-08

最新评论