Spring 입문 실전 의 프로필 상세 설명

11489 단어 springprofile
머리말
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.activespring.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 방법 을 실행 하여 테스트 통과

총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기