(스프링) 2장 자동으로 빈 와이어링 하기

**JUnit을 이용한 Spring 테스트 참고: http://www.codekin.com/?p=1334

*스프링은 두 가지 방법으로 오토와이어링을 수행한다.


  • 컴포넌트 스캐닝- 스프링은 애플리케이션 컨텍스트에서 생성되는 빈을 자동으로 발견한다.
  • 오토와이어링- 스프링은 자동으로 빈 의존성을 충족시킨다.

--컴포넌트 스캐닝과 오토와이어링을 모두 사용하면 강력하고, 명시적 설정을 최소한으로 유지하는데 도움이 된다.


1. 발견가능한 빈 만들기

*CompactDisc 인터페이스는 자바언어를 사용하여 CD개념을 정의


* @Component로 애너테이트된 SgtPeppers의 CompactDisc구현


*컴포넌트 스캐닝을 가능케 하는 @ComponentScan



**XML로 컴포넌트 스캐닝 활성화하기

<context: component-scan base-package="soundsystem"/>


2. 컴포넌트 스캔된 빈 명명하기

스프링 애플리케이션 컨텍스트에서 모든 빈은 ID가 주어진다. 1번에서 확실하게 제시되지 않은 이유는 SgtPeppers빈에 ID가 명시적으로 주어지지 않아도 클래스 명으로 부터 유추되어 할당되었기 때문이다. 구체적으로 빈은 클래스 명의 첫 글자를 소문자로 바꾼 sgtPepper ID를 가진다. 
만약 빈에 다른 ID를 주고 싶다면 @Component 애너테이션에 원하는 ID를 값(value)로 넣어주는 것이 전부다.



빈에 이름을 부여하는 다른 방법에서는 @Component애너테이션을 더 이상 사용하지 않는다. 대신 빈 ID를 제공하기 위해서 @Named애너테이션을 사용한다.

@Named("lonelyHeartsClub")
미묘한 차이가 있지만 대부분의 경우 호환 가능하다.

3. 컴포넌트 스캐닝을 위한 베이스 패키지 세팅

지금까지 애트리뷰트 없이 @ComponentScan을 사용했다. 컴포넌트 검새을 위한 베이스 패키지로서 설정 클래스 패키지가 기본이라는 의미다.

베이스 패키지를 명시적으로 세팅해야 하는 한가지 공통 이유는 애플리케이션 코드와 분리하여 설정 코드를 패키지 안에서 보관할 수 있기 때문이다. 

다른 베이스 패키지를 지정하는 방법은 @ComponentScan의 값 속성에 기술하는 것이다.

@Configuration
@ComponentScan("soundsystem")
public class ~~~{}


또는 basePackages애트립트를 사용한다.

@Configuration
@ComponentScan(basePackages="soundsystem")
public class ~~~{}

복수형도 가능하다.

@ComponentScan(basePackages={"soundsystem","video"}
public class~~~{}


패키지를 간단한 String값으로 지정하지 않고, @ComponentScan옵션으로 제공하는 패키지 내의 클래스나 인터페이스를 사용할 수 있다.


@Configuration
@ComponentScan(basePackageClasses={CDPlayer.class, DVDPlayer.class})
public class ~~~{}

-->클래스가 어떤 패키지 안에있든 컴포넌트 스캐닝을 위한 베이스 패키지로서 사용한다.


4. 오토와이어링되는 빈의 애너테이션

오토와이어링은 스프링이 빈의 요구사항과 매칭되는 애프리케이션 컨텍스트 상에서 다른 빈을 찾아 빈 간의 의존성을 자동으로 만족시키도록 하는 수단이다.
@Autowired애너테이션을 사용한다.



댓글

이 블로그의 인기 게시물

(ElasticSearch) 결과에서 순서 정렬

(네트워크)폴링방식 vs 롱 폴링방식

(18장) WebSocekt과 STOMP를 사용하여 메시징하기