SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-002-激活PROFILE、设置默认值、@ActiveProfiles
一、
Spring honors two separate properties when determining which profiles are active:
spring.profiles.active and spring.profiles.default . If spring.profiles.active
is set, then its value determines which profiles are active. But if spring
.profiles.active isn’t set, then Spring looks to spring.profiles.default . If neither
spring.profiles.active nor spring.profiles.default is set, then there are no
active profiles, and only those beans that aren’t defined as being in a profile are created.
There are several ways to set these properties:
As initialization parameters on DispatcherServlet
As context parameters of a web application
As JNDI entries
As environment variables
As JVM system properties
Using the @ActiveProfiles annotation on an integration test class
二、
1.在web.xml中设置PROFILE的默认值
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 3 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 4 <context-param> 5 <param-name>contextConfigLocation</param-name> 6 <param-value>/WEB-INF/spring/root-context.xml</param-value> 7 </context-param> 8 <context-param> 9 <param-name>spring.profiles.default</param-name> 10 <param-value>dev</param-value> 11 </context-param> 12 <listener> 13 <listener-class> 14 org.springframework.web.context.ContextLoaderListener 15 </listener-class> 16 </listener> 17 <servlet> 18 <servlet-name>appServlet</servlet-name> 19 <servlet-class> 20 org.springframework.web.servlet.DispatcherServlet 21 </servlet-class> 22 <init-param> 23 <param-name>spring.profiles.default</param-name> 24 <param-value>dev</param-value> 25 </init-param> 26 <load-on-startup>1</load-on-startup> 27 </servlet> 28 <servlet-mapping> 29 <servlet-name>appServlet</servlet-name> 30 <url-pattern>/</url-pattern> 31 </servlet-mapping> 32 </web-app>
2.在测试时可以用@ActiveProfiles来切换profile
1 package profiles; 2 3 import static org.junit.Assert.assertNotNull; 4 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.util.List; 8 9 import javax.sql.DataSource; 10 import static org.junit.Assert.*; 11 12 import org.junit.Test; 13 import org.junit.runner.RunWith; 14 import org.springframework.beans.factory.annotation.Autowired; 15 import org.springframework.jdbc.core.JdbcTemplate; 16 import org.springframework.jdbc.core.RowMapper; 17 import org.springframework.test.context.ActiveProfiles; 18 import org.springframework.test.context.ContextConfiguration; 19 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 20 21 import com.myapp.DataSourceConfig; 22 23 public class DataSourceConfigTest { 24 25 @RunWith(SpringJUnit4ClassRunner.class) 26 @ContextConfiguration(classes=DataSourceConfig.class) 27 @ActiveProfiles("dev") 28 public static class DevDataSourceTest { 29 @Autowired 30 private DataSource dataSource; 31 32 @Test 33 public void shouldBeEmbeddedDatasource() { 34 assertNotNull(dataSource); 35 JdbcTemplate jdbc = new JdbcTemplate(dataSource); 36 List<String> results = jdbc.query("select id, name from Things", new RowMapper<String>() { 37 @Override 38 public String mapRow(ResultSet rs, int rowNum) throws SQLException { 39 return rs.getLong("id") + ":" + rs.getString("name"); 40 } 41 }); 42 43 assertEquals(1, results.size()); 44 assertEquals("1:A", results.get(0)); 45 } 46 } 47 48 @RunWith(SpringJUnit4ClassRunner.class) 49 @ContextConfiguration(classes=DataSourceConfig.class) 50 @ActiveProfiles("prod") 51 public static class ProductionDataSourceTest { 52 @Autowired 53 private DataSource dataSource; 54 55 @Test 56 public void shouldBeEmbeddedDatasource() { 57 // should be null, because there isn't a datasource configured in JNDI 58 assertNull(dataSource); 59 } 60 } 61 62 @RunWith(SpringJUnit4ClassRunner.class) 63 @ContextConfiguration("classpath:datasource-config.xml") 64 @ActiveProfiles("dev") 65 public static class DevDataSourceTest_XMLConfig { 66 @Autowired 67 private DataSource dataSource; 68 69 @Test 70 public void shouldBeEmbeddedDatasource() { 71 assertNotNull(dataSource); 72 JdbcTemplate jdbc = new JdbcTemplate(dataSource); 73 List<String> results = jdbc.query("select id, name from Things", new RowMapper<String>() { 74 @Override 75 public String mapRow(ResultSet rs, int rowNum) throws SQLException { 76 return rs.getLong("id") + ":" + rs.getString("name"); 77 } 78 }); 79 80 assertEquals(1, results.size()); 81 assertEquals("1:A", results.get(0)); 82 } 83 } 84 85 @RunWith(SpringJUnit4ClassRunner.class) 86 @ContextConfiguration("classpath:datasource-config.xml") 87 @ActiveProfiles("prod") 88 public static class ProductionDataSourceTest_XMLConfig { 89 @Autowired(required=false) 90 private DataSource dataSource; 91 92 @Test 93 public void shouldBeEmbeddedDatasource() { 94 // should be null, because there isn't a datasource configured in JNDI 95 assertNull(dataSource); 96 } 97 } 98 99 }