ApplicationContext는 BeanFactory 기능 외에도 다양한 기능을 한다. 그중에서도 EnvironmentCapable이라는 기능이 있다.
public interface ApplicationContext
extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver
EnvironmentCapable은 프로파일과 프로퍼티를 다루는 인터페이스이다.
ApplicationContext extends EnvironmentCapable
프로파일
프로파일 유즈케이스
테스트 환경, 프로덕션 환경, 스테이징 환경에서는 특정한 환경에서 어떤 빈을 쓰겠다고 지정할 수 있다.
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
//System.out.println(Arrays.toString(environment.getActiveProfiles()));
//System.out.println(Arrays.toString(environment.getDefaultProfiles()));
}
}
EnvironmentCable의 getEnvironment() 메서드를 사용할 수 있다.
프로파일 정의하기
public class TestBookRepository implements BookRepository{
}
@Configuration
//@Profile("test")
public class TestConfiguration {
@Bean
@Profile("test")
public BookRepository bookRepository(){
return new TestBookRepository();
}
}
이 빈 설정파일은 TestProfile Environment일때만 사용할 수 있다.
프로파일 설정하기


프로파일 표현식
@Repository
@Profile("!prod")
public class TestBookRepository implements BookRepository{
}
프로퍼티
프로퍼티에는 우선 순위가 있다.

프로퍼티 값 가져오는 방법
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Autowired
BookRepository bookRepository;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(environment.getProperty("app.name"));
}
}
아니면 체계적으로 properties 파일을 만들 수 있다.

@SpringBootApplication
@PropertySource("classpath:/app.properties")
public class Springtest4Application {
public static void main(String[] args) {
SpringApplication.run(Springtest4Application.class, args);
}
}
그렇다면 Properties 파일과 JVM properties로 넘겨준 값 중에 어떤 것이 더 우선순위가 높은가? JVM Properties가 우선순위가 더 높다.
또한 스프링부트에서는 다음과 같은 것도 가능하다.
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
ApplicationContext ctx;
@Autowired
BookRepository bookRepository;
@Value("${app.name}")
String appName;
@Override
public void run(ApplicationArguments args) throws Exception {
Environment environment = ctx.getEnvironment();
System.out.println(environment.getProperty("app.name"));
System.out.println(appName);
}
}
참고