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);
}
}
참고