Environment는 프로파일과 프로퍼티를 다루는 인터페이스로 테스트 환경, 프로덕션 환경등 각각에 환경에 따라 다른 빈들을 써야하는 경우 혹은 특정한 빈을 써야하는 경우 사용
프로파일
- 프로파일은 빈들의 그룹
- ApplicatioContext의 getEnvironment()를 통해 호출
- 활성화할 프로파일 확인 및 설정
1 2 3 4 5 6 7 8 9 10
| @Component public class AppRunner implements ApplicationRunner{ @Autowired ApplicationContext ctx;
@Override public void run(ApplicationArguments args) throws Exception { Environment environment = ctx.getEnvironment(); } }
|
클래스 정의 @Configuration @Profile(“test”) 를 통해 설정
메소드 정의 @Bean @Profile(“test”)를 통해 설정
1 2 3 4 5
| @Configuration @Profile("test") public class TestConfiguration { ... }
|
-Dspring.profiles.active=”test,A,B…”으로 설정가능
프로퍼티
- 다양한 방법으로 정의할 수 있는 설정값
- -Dapp.name=spring5
- properties파일 사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @Component public class AppRunner implements ApplicationRunner{ @Autowired ApplicationContext ctx;
@Value("${app.about}") String appAbout;
@Override public void run(ApplicationArguments args) throws Exception { Environment environment = ctx.getEnvironment(); System.out.println(environment.getProperty("app.name")); System.out.println(this.appAbout);
} }
|
- 우선순위
- ServletConfig 매개변수
- ServletContext 매개변수
- JNDI (java:comp/env/)
- JVM 시스템 프로퍼티 (-Dkey=”value”)
- JVM 시스템 환경 변수(운영 체제 환경 변수)
MessageSource
i18n 기능을 제고하는 인터페이스로 스프링 부트를 사용하면 별다른 설정 없이 messages.properties 사용가능
- ApplicatioContext의 getMessageSource()를 통해 호출
- messages.properties, messages_ko_kr.properties…
1 2 3 4
| # messages.properties greeting=Hello, {0} #messages.properties greeting=안녕, {0}
|
1 2 3 4 5 6 7 8 9 10 11 12
| @Component public class AppRunner implements ApplicationRunner{
@Autowired MessageSource messageSource;
@Override public void run(ApplicationArguments args) throws Exception { System.out.println(messageSource.getMessage("greeting", new String[]{"hsoh"}, Locale.KOREA)); System.out.println(messageSource.getMessage("greeting", new String[]{"hsoh"}, Locale.getDefault())); } }
|
ApplicationEventPublisher
이벤트 프로그래밍에 필요한 인터페이스를 제공(옵저버 패턴의 구현체)
- ApplicationEventPublisher의 메소드 publishEvent(ApplicationEvent event)로 이벤트 발생
- 4.2 이전에는 ApplicationEvent를 상속받아서 이벤트 구현
- 이벤트를 발생시키고 EventListener를 등록하여 이벤트 처리
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class AppEvent {
private int data;
private Object source;
public AppEvent(Object source, int data) { this.data = data; this.source = source; }
public Object getSource() { return source; }
public int getData() { return data; } }
|
1 2 3 4 5 6 7 8 9 10 11
| @Component public class AppRunner implements ApplicationRunner{
@Autowired ApplicationEventPublisher publisher;
@Override public void run(ApplicationArguments args) throws Exception { publisher.publishEvent(new AppEvent(this, 100)); } }
|
1 2 3 4 5 6 7 8 9 10
| @Component public class AppEventHandler {
@EventListener @Async public void handle(AppEvent event){ System.out.println(Thread.currentThread().toString()); System.out.println("AppEventHandler = " +event.getData()); } }
|
- 순서지정은 @Order로 지정
- 비동기적 실행은 @Async 사용
ResourceLoader
리소스를 읽어오는 기능을 제공하는 인터페이스
- ResourceLoader의 getResource(java.lang.String location)로 리소스 조회
- 다양한 방법으로 조회가능
- 파일 시스템에서 읽기
- 클래스 패스에서 읽기
- URL로 읽기
- 상대/절대 경로로 읽기
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Component public class AppRunner implements ApplicationRunner{
@Autowired ResourceLoader resourceLoader;
@Override public void run(ApplicationArguments args) throws Exception { Resource resource = resourceLoader.getResource("classpath:text.txt"); System.out.println(resource.exists()); System.out.println(resource.getDescription()); Files.lines(Paths.get(resource.getURI())).forEach(System.out::println); } }
|
Contributors