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 }
原文地址:https://www.cnblogs.com/shamgod/p/5235287.html