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 = "菊花台";
    /**
     * @see com.xu.CompactDisc#play()
     */
    @Override
    public void play() {
        System.out.println(music);
    }
}
public class MovieDisc implements CompactDisc {
    private String MovieConfig = "泰坦尼克号";
    /**
     * @see com.xu.CompactDisc#play()
     */
    @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>

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

(0)

相关推荐

  • spring Profile如何为不同环境提供不同的配置支持

    说明 Profile为在不同环境下使用不同的配置提供了支持(开发环境下的配置和生产环境下的配置肯定是不同的, 例如, 数据库的配置) . 在spring开发中用@Profile 注解使用来选择行配置系统属性.而在spring boot 中使用跟方便. 传统的spring Profile使用 参考<javaEE 发开的颠覆者>主要结合 @Configuration @Bean 注解使用 如下代码 : @Configuration //声明注解类 public class ProfileConfi

  • springboot学习笔记之 profile多环境配置切换的实现方式

    前言 一个应用程序从开发到上线,往往需要经历几个阶段,例如开发.测试.上线.每个阶段所用到的环境的配置可能都是不一样的,Springboot 应用可以很方便地在各个环境中对配置进行切换.所以,今天主要介绍Springboot profiles实现多环境配置切换. profiles多环境配置切换的四种方式 多个配置文件的方式yml 多文档块方式 设置程序参数 设置虚拟机参数 1.多个配置文件的方式 1.1.修改application.properties server.port=8080 1.2.

  • 详解springboot + profile(不同环境读取不同配置)

    具体做法: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中:prod环境下的配置配置在application-prod.properties中. 在application.properties中指定使用哪一个文件 1.application-dev.properties(dev环境下的配置) profile = dev_envrimont 2.application-prod.properties(prod环境下的配置) pr

  • Spring Boot使用profile如何配置不同环境的配置文件

    在springboot的开发中,有时候我们会有不同的配置,例如日志打印,数据库连接等,开发,测试,生产每个环境可能配置都不一致,还好,springboot支持通过不同的profile来配置不同环境的配置,下面就大致介绍一下yml配置文件跟properties配置文件怎么使用profile配置不同环境的配置文件... 先介绍一下开发环境: jdk版本是1.8 springboot的版本是1.4.1 开发工具为 intellij idea 我们先来介绍,使用一个yml文件,通过不同的profile来

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

    Spring 根据环境切换配置 @Profile 我们实际开发中往往有多个环境,比如测试环境.开发环境.生产环境等:不同的环境往往配置也有区别,一直切换环境的配置很麻烦,Spring 为我们提供了一个注解,可以快速切换环境配置. @Profile 我们新建一个配置,作用是注册三个数据源,因为不同的环境使用的数据库一般不一样: @Configuration @PropertySource("classpath:/person.properties") public class MainC

  • 详解如何在低版本的Spring中快速实现类似自动配置的功能

    在 Spring 4 后才引入了 @Conditional 等条件注解,它是 Spring Boot 中实现自动配置的最大功臣! 那么问题来了:如果我们还在使用 Spring 3.x 的老版本,这时候要怎么实现一个自动配置呢? 需求和问题 核心的诉求 现存系统,不打算重构 Spring 版本为 3.x,也不打算升级版本和引入 Spring Boot 期望能够在少改代码的前提下实现功能增强 比如说: 希望能够给全站统一添加上日志记录(如:RPC 框架 Web 调用的摘要信息.数据库访问层的摘要信息

  • 如何在Spring中使用编码方式动态配置Bean详解

    bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序进行调用. 本文将给大家详细介绍关于在Spring中使用编码方式动态配置Bean的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 1 DefaultListableBea

  • 在Spring中基于Java类进行配置的完整步骤

    前言 JavaConfig 原来是 Spring 的一个子项目,它通过 Java 类的方式提供 Bean 的定义信息,在 Spring4 的版本, JavaConfig 已正式成为 Spring4 的核心功能 . 本文将详细介绍关于Spring中基于Java类进行配置的相关内容,下面话不多说了,来一起看看详细的介绍吧 1 定义 Bean 普通的 POJO 只要标注了 @Configuration 注解,就可以为 Spring 容器提供 Bean 的定义信息. @Configuration pub

  • Spring中的事务管理如何配置

    这篇文章主要介绍了spring中的事务管理如何配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在springboot中,使用事务非常的简单,因为springboot已经帮我们配置好了,只需要加上注解@Transactional即可 在spring中我们需要做一些配置:主要有三点: @Transactional:在相应的方法上加上这个注解 @EnableTransactionManagement:在配置类中加上,开启事务管理 需要在配置类中加

  • Spring中基于XML的AOP配置详解

    1. 准备工作 1.1 创建工程 day03_eesy_03SpringAOP 1.2 在配置文件pom.xml中添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  • SpringCloud Config配置中心原理以及环境切换方式

    目录 Config配置中心原理以及环境切换 原理介绍 一.ConfigServer引入依赖 二.Configclient 注意 简易配置中心原理及流程说明 原理 简易搭建例子 Config配置中心原理以及环境切换 springCloud config项目,用来为分布式的微服务系统中提供集成式外部配置支持,分为客户端和服务端 spring官方如下介绍: Spring Cloud Config provides server and client-side support for externali

  • Mongodb3.0.5 副本集搭建及spring和java连接副本集配置详细介绍

    Mongodb3.0.5 副本集搭建及spring和java连接副本集配置详细介绍 一.基本环境: mongdb3.0.5数据库 spring-data-MongoDB-1.7.2.jar mongo-Java-driver-3.0.2.jar Linux-redhat6.3 tomcat7 二.搭建mongodb副本集: 1.  分别在三台linux系统机上安装mongodb,(为避免和机器上原有的mongodb端口冲突,这里设为57017): 192.168.0.160 192.168.0.

  • Spring中@Async用法详解及简单实例

    Spring中@Async用法 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后,就已经内置了@Async来完美解决这个问题,本文将完成介绍@Async的用法. 1.  何为异步调用? 在解释异步调用之前,我们先来看同步调用的定义:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果. 异步调用则是只是发送了调用的指令,调用者无需

  • Spring中基于xml的AOP的详细步骤

    1.Aop 全程是Aspect Oriented Programming 即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的同一维护的一种技术.Aop是oop的延续,是软件开发中的 一个热点,也是Spring框架中一个重要的内容.是函数式编程的一个衍生范例,利用Aop可以对业务逻辑各个部分进行分割,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用行,提高了开发效率.简单的说就是把我们程序中的重复代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上已有的方法进

随机推荐