Spring-Profile详解
1.Spring中的Profile是什么?
我们以前所定义的bean,当Spring容器启动的时候,就会一股脑的全部加载这些信息完成对bean的创建,而使用Profile之后,它会将bean的定义进行更细粒度的划分,将这些bean划分为几个不同的组,当Spring容器加载配置信息的时候,首先查找激活的Profile,然后只会去加载激活的组中所定义的bean的信息,而不被激活的Profile中的bean是不会被创建的。
2.为什么要使用Profile?
由于我们在平时的开发中,通常会出现在开发,测试,和实际部署的三个环境使用三个不同的数据库,这时,我们只能去修改配置文件,。而使用Profile之后,我们就可以定义三个配置文件,一个用于开发,一个用于测试,一个用于生产,在实际运行的时候给定一个参数激活即可。那么容器只会加载激活后的配置文件,大大的省去加载配置信息而带来的烦恼。
3.如何使用?
MAVEN依赖
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--指定Spring版本,该版本必须大于等于3.1--> <spring.version>4.2.4.RELEASE</spring.version> <!--指定JDK编译环境--> <java.version>1.7</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> </plugins> </build>
/** * 定义接口,在实际中可能是一个数据源 * 在开发的时候与实际部署的时候分别使用不同的实现 */ public interface HelloService { public String sayHello(); }
package com.panlingxiao.spring.profile.service.produce; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.panlingxiao.spring.profile.service.HelloService; /** * 模拟在生产环境下需要使用的类 */ @Component public class ProduceHelloService implements HelloService { //这个值读取生产环境下的配置注入 @Value("#{config.name}") private String name; public String sayHello() { return String.format("hello,I'm %s,this is a produce environment!", name); } }
package com.panlingxiao.spring.profile.service.dev; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.panlingxiao.spring.profile.service.HelloService; /** * 模拟在开发环境下使用类 */ @Component public class DevHelloService implements HelloService{ //这个值是读取开发环境下的配置文件注入 @Value("#{config.name}") private String name; public String sayHello() { return String.format("hello,I'm %s,this is a development environment!", name); } }
定义配置Spring配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"> <!-- 定义开发的profile --> <beans profile="development"> <!-- 只扫描开发环境下使用的类 --> <context:component-scan base-package="com.panlingxiao.spring.profile.service.dev" /> <!-- 加载开发使用的配置文件 --> <util:properties id="config" location="classpath:dev/config.properties"/> </beans> <!-- 定义生产使用的profile --> <beans profile="produce"> <!-- 只扫描生产环境下使用的类 --> <context:component-scan base-package="com.panlingxiao.spring.profile.service.produce" /> <!-- 加载生产使用的配置文件 --> <util:properties id="config" location="classpath:produce/config.properties"/> </beans> </beans>
编写测试类 package com.panlingxiao.spring.profile.test; 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; import com.panlingxiao.spring.profile.service.HelloService; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:spring-profile.xml") /* * 使用注册来完成对profile的激活, * 传入对应的profile名字即可,可以传入produce或者dev */ @ActiveProfiles("produce") public class TestActiveProfile { @Autowired private HelloService hs; @Test public void testProfile() throws Exception { String value = hs.sayHello(); System.out.println(value); } }
激活Profile的几种方式
- 作为SpringMVC中的DispatcherServlet的初始化参数
- 作为Web 应用上下文中的初始化参数
- 作为JNDI的入口
- 作为环境变量
- 作为虚拟机的系统参数
- 使用@AtivceProfile来进行激活
岁月本长而忙者自促;天地本宽而卑者自隘;风花雪月本闲,而劳忧者自冗;天行健,君子以自强不息;地势坤,君子以厚德载物;宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒.不妄取,不妄予,不妄想,不妄求,与人方便,随遇而安