Spring 입문 실전 의 프로필 상세 설명
Spring 의 Profile 기능 은 Spring 3.1 버 전에 서 이미 나 왔 습 니 다.이것 은 우리 가 Spring 용기 에서 정의 한 Bean 의 논리 그룹 이름 으로 이해 할 수 있 습 니 다.이 Profile 이 활성화 되 었 을 때 만 Profile 에 대응 하 는 Bean 을 Spring 용기 에 등록 할 수 있 습 니 다.
Profile 이라는 키 워드 를 보면 그 를 똑바로 본 적 이 없 거나 머 릿 속 에 흐릿 한 인상 이 있 을 지도 모른다.예 를 들 어 여기 Springmvc 의 Profile 을 제외 하고 Maven 에 도 Profile 이라는 태그 가 있다.
말 그대로 Profile 은 측면 을 나타 내 는데 어떤 상황 에서 측면 이라는 기능 을 사용 할 수 있 습 니까?측면 은 구체 적 으로 어떤 의미 가 있 습 니까?
예 를 들 어 데이터 베 이 스 를 설정 하 는 문제 에 대해 개발 한 눈 에 끼 워 넣 은 데이터 베 이 스 를 사용 하고 테스트 데 이 터 를 불 러 올 수 있 습 니 다(나중에 코드 예제 가 있 습 니 다).하지만 테스트 의 눈 에는 데이터베이스 연결 탱크 가 있 을 수 있 습 니 다.
@Bean(destroyMethod="close")
public DataSource dataSource () {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:h2:tcp://dbserver/~/test");
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUsername("sa");
dataSource.setPassword("password");
dataSource.setInitialSize(20);
dataSource.setMaxActive(30);
return dataSource;
}
물론 제품 환경 에서 의 배치 등 도 있다.이런 백화제방 의 설정 방식 에 대해 당신 은 무슨 말 을 할 수 있 습 니까?묵묵히 이 세트 의 환경 에 해당 하 는 설정 파일 을 배치 합 니 다.profflee 라 는 세트 가 없 으 면 우 리 는 항상 이렇게 합 니 다.그러나 지금 은 Profile 이 있 으 면 우 리 는 선택 이 많아 지고 더욱 스마트 하고 편리 한 설정 방식 이 생 겼 다.Profile 설정 을 통 해 Spring 은 환경 에 따라 실행 단계 에서 bean 의 생 성 여 부 를 결정 할 수 있 습 니 다.예 를 들 어 다음 과 같 습 니 다.주로 Profile bean 의 설정 과 활성화 에서 전 개 됩 니 다.
Profile bean 설정
주석@Profile 설정 을 통 해
위의 예 를 들 어 첫 번 째 상황 에 대해 개발 환경 에서 우 리 는 데이터 소스 를 설정 하 는 것 이 이 럴 수 있 습 니 다.
@Bean(destroyMethod = "shutdown")
public DataSource embeddedDataSource() {
return new EmbeddedDatabaseBuilder()
.addScript("classpath:schema.sql")
.addScript("classpath:test-data.sql")
.build();
}
Embedded DatabaseBuilder 를 사용 하여 끼 워 넣 은 데이터 베 이 스 를 만 들 것 입 니 다.클래스 파일 에 있 는 schema.sql 파일 에 패턴 을 정의 합 니 다.schema.sql
create table Things (
id identity,
name varchar(100)
);
두 필드 를 포함 하 는 Things 표를 정의 합 니 다.모드 파일 을 제외 하고 테스트 데 이 터 를 test-data.sql 로 불 러 와 야 합 니 다.
test-data.sql
insert into Things (name) values ('A')
이@Bean 은 개발 환경 에서 만 들 었 는 지 제품 환경 에서 만 들 었 는 지 전혀 모 릅 니 다.그래서 우 리 는 주석@Profile 을 사용 하여 이 bean 에 표 지 를 하 는 데 도움 을 줄 수 있 습 니 다.Spring 3.1 버 전에 서 bean profflee 기능 을 도입 하여 서로 다른 bean 을 하나 이상 의 profflee 에 정의 한 다음 에 배치 응용 프로그램 에서 그 profflee 를 활성화 하 라 고 알려 주면 해당 하 는 bean 이 생 성 됩 니 다.
여기
@Configuration
@Profile("dev")
public class DevelopmentProfileConfig {
@Bean(destroyMethod = "shutdown")
public DataSource embeddedDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:schema.sql")
.addScript("classpath:test-data.sql")
.build();
}
}
@Profile("dev")
EmbedderDataSource bean 을 통 해 dev 환경 에서 만 들 bean 으로 표시 합 니 다.메모:1.@Profile 불 러 오 는 클래스 단계 에서 dev profile 이 활성화 되 지 않 으 면 클래스 에 대응 하 는 모든 bean 이 생 성 되 지 않 습 니 다.
2.현재 dev 환경 이 활성화 되 었 다 면@Profile 을 사용 하지 않 은 bean 은 모두 생 성 되 고 다른 profile 로 표 시 됩 니 다.예 를 들 어 prod 와 같은 bean 은 만 들 지 않 습 니 다.
3.3.2 부터@Profile 은 클래스 단 계 를 불 러 올 수 있 을 뿐만 아니 라 불 러 올 수 있 습 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
package com.myapp;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.jndi.JndiObjectFactoryBean;
@Configuration
public class DataSourceConfig {
@Bean(destroyMethod = "shutdown")
@Profile("dev")
public DataSource embeddedDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:schema.sql")
.addScript("classpath:test-data.sql")
.build();
}
@Bean
@Profile("prod")
public DataSource jndiDataSource() {
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiName("jdbc/myDS");
jndiObjectFactoryBean.setResourceRef(true);
jndiObjectFactoryBean.setProxyInterface(javax.sql.DataSource.class);
return (DataSource) jndiObjectFactoryBean.getObject();
}
}
xml 프로필 설정간단 한 주석 방식 을 제외 하고 우 리 는 xml 설정 파일 에서 설명 하 는 방식 을 통 해 다음 과 같이 구체 적 으로 설정 할 수 있 습 니 다.
datasource-config.xml
<?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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<beans profile="dev">
<jdbc:embedded-database type="H2">
<jdbc:script location="classpath:schema.sql" />
<jdbc:script location="classpath:test-data.sql" />
</jdbc:embedded-database>
</beans>
<beans profile="prod">
<jee:jndi-lookup
lazy-init="true"
jndi-name="jdbc/myDatabase"
resource-ref="true"
proxy-interface="javax.sql.DataSource" />
</beans>
</beans>
여기에 두 가지 환경 과 대응 하 는 프로필 을 각각 밝 혔 다.프로필 활성화
프로필 을 설 정 했 지만 그 에 맞 는 환경 을 어떻게 활성화 할 것 인가.여기 서 우 리 는 두 개의 속성
spring.profile.active
과spring.profile.default
이 필요 하 다.spring.profile.active
가 할당 되면spring.profile.default
작용 하지 않 고spring.profie.active
할당 이 없 으 면 기본spring.profile.default
설정 값 을 사용 합 니 다.물론 둘 다 설정 되 어 있 지 않 으 면 해당 프로필 에 정 의 된 bean 만 만 만 들 수 있 습 니 다.이 두 속성 을 설정 하 는 방법 은 매우 많다.
DisfactcherServlet 의 초기 화 매개 변수
웹 응용 컨 텍스트 매개 변수
JNDI 항목 으로
환경 변수 로 서
JVM 으로서 의 시스템 속성
통합 테스트 클래스 에서@ActiveProfiles 주석 설정 사용 하기
예 를 들 어 우 리 는 웹.xml 에서 코드 를 다음 과 같이 설명 할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<web -app version="2.5"
...>
// profile
<context-param>
<param-name>spring.profile.default</param-name>
<param-value>dev</param-value>
</context-param>
...
<servlet>
...
// Serlvet profile
<init-param>
<param-name>spring-profiles.default</param-name>
<param-value>dev</param-value>
</init-prama>
...
<web-app>
이렇게 하면 그 환경 을 시작 하고 그 에 상응하는 bean 을 준비 해 야 한다 고 지정 할 수 있다.또한,spring 은 왜 간단 한 주 해 를 제공 합 니까?@ActiveProfiles 를 사용 할 수 있 습 니 다.테스트 를 실행 할 때 그 profflee 를 활성화 해 야 합 니 다.예 를 들 어 여기 테스트 클래스 DevDataSourceTest.
package profiles;
import static org.junit.Assert.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.myapp.DataSourceConfig;
public class DataSourceConfigTest {
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=DataSourceConfig.class)
@ActiveProfiles("dev")
public static class DevDataSourceTest {
@Autowired
private DataSource dataSource;
@Test
public void shouldBeEmbeddedDatasource() {
assertNotNull(dataSource);
JdbcTemplate jdbc = new JdbcTemplate(dataSource);
List<String> results = jdbc.query("select id, name from Things", new RowMapper<String>() {
@Override
public String mapRow(ResultSet rs, int rowNum) throws SQLException {
return rs.getLong("id") + ":" + rs.getString("name");
}
});
assertEquals(1, results.size());
assertEquals("1:A", results.get(0));
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=DataSourceConfig.class)
@ActiveProfiles("prod")
public static class ProductionDataSourceTest {
@Autowired
private DataSource dataSource;
@Test
public void shouldBeEmbeddedDatasource() {
// should be null, because there isn't a datasource configured in JNDI
assertNull(dataSource);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:datasource-config.xml")
@ActiveProfiles("dev")
public static class DevDataSourceTest_XMLConfig {
@Autowired
private DataSource dataSource;
@Test
public void shouldBeEmbeddedDatasource() {
assertNotNull(dataSource);
JdbcTemplate jdbc = new JdbcTemplate(dataSource);
List<String> results = jdbc.query("select id, name from Things", new RowMapper<String>() {
@Override
public String mapRow(ResultSet rs, int rowNum) throws SQLException {
return rs.getLong("id") + ":" + rs.getString("name");
}
});
assertEquals(1, results.size());
assertEquals("1:A", results.get(0));
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:datasource-config.xml")
@ActiveProfiles("prod")
public static class ProductionDataSourceTest_XMLConfig {
@Autowired(required=false)
private DataSource dataSource;
@Test
public void shouldBeEmbeddedDatasource() {
// should be null, because there isn't a datasource configured in JNDI
assertNull(dataSource);
}
}
}
shouldBeEmbeddedDatasource 방법 을 실행 하여 테스트 통과총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.