스프링 DI(의존주입)-4

1.의존 자동 주입-2

바로 앞 포스트에서 Autowired 어노테이션을 이용한 의존 객체 자동 주입을 알게 되었다.
스프링은 Autowired 외에도 Resource 어노테이션을 이용한 자동 주입을 지원한다.

Autowired가 타입을 이용하는 반면 Resource는 빈의 이름을 이용한다는 차이점이 있다.

Autowired와 사용 방법에서 많은 차이는 없다.

  1. 설정 XML 내에 <context:annotation-config/> 추가
  2. 의존 주입 대상에 @Resource 어노테이션 작성

하지만 큰 차이점이 존재하는데
Autowired와 다르게 생성자에는 적용할 수 없다는 점이다.
그 외에 필드나 설정 메소드에는 동일하게 적용할 수 있다.

  • 필드 자동 주입

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public calss MemberRegisterService {
    @Resource(name="memberDao")
    private MemberDao memberDao; // 의존 주입

    public MemberRegisterService(MemberDao memberDao) {
    this.memberDao = memberDao;
    }
    ...
    }
  • 설정 메소드 자동 주입

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public calss MemberPrinter {
    private MemberPrinter printer;

    @Resource(name="memberPrint")
    public void setPrinter(MemberPrinter printer) { // 의존 주입
    this.printer = printer;
    }
    ...
    }

위와 같이 필드와 설정 메소드에 설정할 수 있다.

Autowired와 동일하게 의존 객체를 자동 주입할 경우 constructor-arg나 property 태그를 사용하지 않아도 된다.

1
2
3
4
5
<context:annotation-config/> // Autowired 처리

<bean id="memberDao" class="kr.co.jhdev.MemberDao"></bean> // Bean 등록

<bean id="memberPrinter" class="kr.co.jhdev.MemberPrinter"></bean> // Bean 등록

설정 XML에 Bean을 등록하고 id 속성을 Resource 어노테이션의 name 속성과 매핑해준다.

2. Resource의 기본적인 특성

Resource는 Autowired와 다르게 빈의 이름을 기준으로 주입한다고 설명했다.

만약 Resource 어노테이션의 name 속성을 설정하지 않는다면 어떻게 될까?

답은 Autowired와 같이 동일한 유형을 찾아 주입한다.
Autowired와 동작 순서가 반대인 셈이다.
Resource 또한 name 속성이 없고 동일 유형의 빈이 다수 존재한다면 Exception이 발생한다.

3. Resource의 동작 순서

Autowired와 반대 순서로 동작하는 Resource 동작 순서를 정리한다.
스프링에서 Resource 어노테이션 추가 시, 동작하는 순서는 아래와 같다.

  1. name 속성 값과 동일한 빈 객체를 찾고 해당 객체를 사용한다.

  2. name 속성 값이 없을 경우, 동일 타입의 객체를 검색하고 1개일 경우, 해당 객체를 사용한다.

  3. name 속성 값이 없고 동일 타입을 갖는 빈 객체가 2개 이상일 경우, 이름이 같은 빈 객체를 찾는다.

  4. name 속성 값이 없고 동일 타입을 갖는 빈 객체가 2개 이상이면서 같은 이름을 가진 빈 객체가 없는 경우 @Qualifier(한정자) 값의 빈 객체를 찾는다.

  5. 모두 해당하지 않으면 Exception이 발생한다.

4. 자동 주입과 명시적 의존 주입 간의 관계

자동 주입과 명시적 의존 주입(constructor-arg, property 태그)을 함께 사용할 수 있다.
이러한 경우 자동 주입보다 명시적 의존 주입을 우선한다.

Share