업데이트:

1 분 소요

개요

이전 스프링 스터디에서는 자바 기반의 빈 설정에 대해서 알아봤다.
자바 기반 컨테이너 설정XML기반 설정 중 무엇을 택해야 하는가는 책에서 취향에 따라 방법을 선택하면 된다고한다.(뭐가 특별히 더 좋고 그런 것은 없는 것 같다.)
하지만 주의할 점으로는 한 프로젝트 안에서는 한 접근 방법만 사용하는 것을 권장한다고 한다.

스프링 컨테이너 설정

빈의 소스로 @Confiuration을 설정한 클래스를 사용하려면 AnnotationConfigApplicationContext의 인스턴스를 만들어서 스프링 컨테이너를 표현해야한다.

@Configuration


public static void main(String args[]) throws Exception{
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BankAppConfiguration.class);
    ...
}

또한 @ComponentJSR330@Named를 설정한 클래스나 @Bean 메서드를 통해 정의한 빈 클래스를 AnnotationConfigApplicationContext생성자의 인수로써 넘길 수 있다.

configClass JVM 프로퍼티를 이용해 어떤 @Configuration 클래스를 AnnotationConfigApplicationContext에 등록할지 결정해줄 수 있다.

...
if(context.getEnvironment().getProperty("configClass").eqaulsIgnoreCase("myConfig")){
    context.register(MyConfig.class);
else{
    context.register(YourConfig.class);
    }
}
context.refresh();
...

getEnvironment()Profile, 즉 어떤 환경에 필요한 설정을 얻어올 수 있다.
context 객체로부터 Profile(아무런 Profile을 적용하지 않았다면 default 프로파일이 적용된다.)이 적용된 어떤Environment객체를 얻어내고 이로부터 JVM 프로퍼티가 getProperty()를 통해 configClass의 프로퍼티 값을 얻어온다.
이 때 프로퍼티 값이 myConfig라면 AnnotationConfigApplicationContextMyConfig가 추가되게 되고,
아니라면 YourConfig가 추가되게 된다.

마지막으로 refresh()를 통해서 AnnotationConfigApplicationContext 인스턴스가 등록된 클래스의 소유권을 확보하도록 만들어줘야 한다.

scan


지금까지와 같이 명시적으로 @Configuration 클래스를 추가하는 방식 말고도 scan()을 통해서 패키지를 지정해 컴포넌트를 스캔할 수 있다.
scan메서드는 <component-scan>엘리먼트와 같은 역할을 하는데,
@Component@Named를 설정한 클래스를 찾아서 스프링 컨테이너에 등록해준다.

context.scan("sample.spring", "com.sample")

위와 같은 상황에서는 두 패키지와 그 하위에 있는 모든 패키지에 있는 @Component가 설정되어있는 클래스를 검색한다.
@Component클래스를 찾게되면 AnnotationConfiogApplicationContext인스턴스에 클래스를 추가해준다.

댓글남기기