spring @profile注解的使用方法

本文主要介绍spring中@profile的使用方法以及在什么情况下使用。

首先说一下为什么要使用这个@profile注解。@profile注解是spring提供的一个用来标明当前运行环境的注解。我们正常开发的过程中经常遇到的问题是,开发环境是一套环境,qa测试是一套环境,线上部署又是一套环境。这样从开发到测试再到部署,会对程序中的配置修改多次,尤其是从qa到上线这个环节,让qa的也不敢保证改了哪个配置之后能不能在线上运行。
为了解决上面的问题,我们一般会使用一种方法,就是配置文件,然后通过不同的环境读取不同的配置文件,从而在不同的场景中跑我们的程序。

那么,spring中的@profile注解的作用就体现在这里。在spring使用DI来依赖注入的时候,能够根据当前制定的运行环境来注入相应的bean。最常见的就是使用不同的DataSource了。

下面详细的介绍一下,如何通过spring的@profile注解实现上面的功能。

首先是新建maven工程

mvn archetype:generate -DarchetypeCatalog=internal

下面是pom文件:

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <springframework.version>4.3.7.RELEASE</springframework.version>
 </properties> 

 <dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
   <scope>test</scope>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>${springframework.version}</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-test</artifactId>
   <version>${springframework.version}</version>
  </dependency> 

 </dependencies>
 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
     <source>1.8</source>
     <target>1.8</target>
     <encoding>utf-8</encoding>
    </configuration>
   </plugin>
   <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
     <archive>
      <manifest>
       <mainClass>com.xueyou.demo</mainClass>
      </manifest>
     </archive>
     <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
     </descriptorRefs>
    </configuration>
    <executions>
     <execution>
      <id>make-assembly</id> <!-- this is used for inheritance merges -->
      <phase>package</phase> <!-- bind to the packaging phase -->
      <goals>
       <goal>single</goal>
      </goals>
     </execution>
    </executions>
   </plugin>
  </plugins>
 </build>

整体看一下工程中的类和接口:

首先是Person类中有一个speak的方法,这个方法是MoveFactor这个借口提供的。Chinese、English和German都实现了这个接口。但是这三个类的@profile中的值是不同的。通过SpringTest中分配不同的activeprofile就能够实现调用不同的speak方法。

下面看代码:
MoveFactor.interface

package com.xueyou.demo; 

public interface MoveFactor {
  void speak();
} 

Person.java

package com.xueyou.demo; 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; 

@Component
public class Person { 

  @Autowired
  private MoveFactor moveFactor; 

  public void speak(){
    moveFactor.speak();
  }
}

Chinese.java

package com.xueyou.demo; 

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component; 

@Configuration
@Profile(value = "dev")
@Component
public class Chinese implements MoveFactor {
  @Override
  public void speak() {
    System.out.println("我是中国人");
  }
}

English.java

package com.xueyou.demo; 

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component; 

@Component
@Profile("qa")
public class English implements MoveFactor{
  @Override
  public void speak() {
    System.out.println("i am an English");
  }
}

German.java

package com.xueyou.demo; 

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component; 

@Component
@Profile("prod")
public class German implements MoveFactor{
  @Override
  public void speak() {
    System.out.println("i am a German");
  }
} 

使用springtest进行测试

package com.xueyou.demo; 

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = App.class)
@ActiveProfiles("dev")
public class SpringTest { 

  @Autowired
  Person p; 

  @Test
  public void testProfile(){
    p.speak();
  } 

}

运行结果:

当修改@ActiveProfile中的值时,输出的内容也会随之改变。

如果使用的是main函数进行真正的开发、测试和上线时,我们需要设置一下运行参数:

-D 后面加上需要设置的spring的属性,就能够在main函数中使用了。

App.java

package com.xueyou.demo; 

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; 

/**
 * Hello world!
// */
@Configuration
@ComponentScan(basePackages = {"com.xueyou.demo"})
public class App {
  public static void main(String[] args) {
    ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(com.xueyou.demo.App.class);
    Person p = context.getBean(Person.class);
    p.speak();
  }
}

运行结果:

如果需要得到当前的activeprofile可以通过ConfigurableApplicationContext的实例来的到。

最后提一下,如果是在web的后台项目中如何进行设置。这个时候我们通过xml的方式进行设置:

<context-param>
 <param-name>spring.profiles.active</param-name>
 <param-value>DOUBLEUPMINT</param-value>
</context-param> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 浅谈spring注解之@profile

    spring中@profile与maven中的profile很相似,通过配置来改变参数. 例如在开发环境与生产环境使用不同的参数,可以配置两套配置文件,通过@profile来激活需要的环境,但维护两套配置文件不如maven中维护一套配置文件,在pom中通过profile来修改配置文件的参数来的实惠. 也有例外,比如我在开发中调用商城接口经常不能返回我需要的数据,每次都需要mock数据,所以我写了一个mock参数的借口调用类,在开发环境中就使用这个类,测试环境与生产环境则使用正常的借口调用类,这样

  • spring @profile注解的使用方法

    本文主要介绍spring中@profile的使用方法以及在什么情况下使用. 首先说一下为什么要使用这个@profile注解.@profile注解是spring提供的一个用来标明当前运行环境的注解.我们正常开发的过程中经常遇到的问题是,开发环境是一套环境,qa测试是一套环境,线上部署又是一套环境.这样从开发到测试再到部署,会对程序中的配置修改多次,尤其是从qa到上线这个环节,让qa的也不敢保证改了哪个配置之后能不能在线上运行. 为了解决上面的问题,我们一般会使用一种方法,就是配置文件,然后通过不同

  • Spring @Profile注解实现多环境配置

    一 前言 springboot中使用多环境开发如此简单,你想知道spring中是如何实现的么?一起来学习吧!!你为什么不好好学习基础,面试一直被diss呢?说到底还不是你认为都会了,其实你都不会,一问三不知!! 二 @profile实现多环境配置 2.1 @profile配置 使用@profile注解的目的是未了多环境开发,比如开发环境使用dev, 生产环境使用prod,就可以使用@Profile注解实现不同的开发环境使用不同的数据源: @profile注解 使用说明: spring3.2之前

  • Spring @Profile注解详解

    @Profile注解详解 @Profile:Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能: 开发环境develop.测试环境test.生产环境master 数据源:(/dev) (/test) (/master) @Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件 1) 加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中.默认是default环境 2) 写在配置类上,只有是指定的环境的时候,整个配置类里面

  • Spring @Configuration注解及配置方法

    Spring @Configuration注解 Spring3.0开始,@Configuration用于定义配置类,定义的配置类可以替换xml文件,一般和@Bean注解联合使用. @Configuration注解主要标注在某个类上,相当于xml配置文件中的<beans> @Bean注解主要标注在某个方法上,相当于xml配置文件中的<bean> 等价于 注意:@Configuration注解的配置类有如下要求: @Configuration不可以是final类型: @Configur

  • Spring @RestController注解组合实现方法解析

    Spring中存在很多注解组合的情况,例如@RestController @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Controller @ResponseBody public @interface RestController { /** * The value may indicate a suggestion for a logical component name, * to b

  • Spring常用注解 使用注解来构造IoC容器的方法

    使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package="pagkage1[,pagkage2,-,pagkageN]"/>. 如:在base-package指明一个包 <context:component-scan base-package="cn.gacl.java"/> 表明cn.gacl.java

  • Spring利用注解整合Mybatis的方法详解

    目录 一.环境准备 步骤1:数据库相关 步骤2:导入jar包 步骤3:创建模型类 步骤4:创建Dao接口和实现类 步骤5:创建Service接口和实现类 步骤6:添加jdbc.properties文件 步骤7:添加Mybatis核心配置文件 步骤8:编写测试程序 二.整合思路分析 三.整合步骤 步骤1:导入整合jar包 步骤2:创建数据源配置类 步骤3:创建Mybatis配置类 步骤4:创建Spring主配置类 步骤5:编写运行程序 一.环境准备 步骤1:数据库相关 建库建表 创建spring_

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

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

  • Spring @Conditional注解原理解析

    这篇文章主要介绍了Spring @Conditional注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 @Conditional是Spring4新提供的注解,它的作用是根据某个条件加载特定的bean. 我们需要创建实现类来实现Condition接口,这是Condition的源码 public interface Condition { boolean matches(ConditionContext var1, AnnotatedT

  • Spring MVC 框架搭建配置方法及详解

    现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理. 一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.jar.comm

随机推荐