특정 Bean의 기능 수행을 위해 다른 Bean을 참조해야 하는 경우 사용하는 Annotation으로는 @Autowired, @Resource 그리고 @Inject가 있다.

  • @Autowired
    Spring Framework에서 지원하는 Dependency 정의 용도의 Annotation으로, Spring Framework에 종속적이긴 하지만 정밀한 Dependency Injection이 필요한 경우에 유용하다.

의존관계를 자동으로 설정해주는 어노테이션

: 타입을 이용하여 의존객체를 자동으로 설정한다.

: 생성자, 필드, 메서드 세곳에 적용 가능하다.

 

예) 프로퍼티 설정 메서드 이용

import org.springframework.beans.factory.annotation.Required

public class TestBean {

    private TestDao testDao;

 

    @Autowired

    public void setTestDao(TestDao testDao) {

        this.testDao = testDao;

    }

}

위와 같은 경우 testDao프로퍼티에 TestDao 타입의 bean객체를 전달한다.

AutowiredAnnotationBeanPostProcessor 클래스를 설정파일에 빈객체로 등록하면 @Autowired 어노테이션을 이용한 자동설정이 적용된다.

 

또한 Required어노테이션과 마찬가지로 <context:annotation-config>태그를 사용하면 된다.

@Autowired 어노테이션은 프로퍼티 설정 메서드 뿐 아니라 일반 메서드나 멤퍼필드 자체에 적용시킬수도 있다.

제너릭이 적용된 컬렉션 타입에도 적용시킬 수 있다.

 

@Autowired 어노테이션은 타입을 이용하여 자동으로 빈객체를 전달하기 때문에 타입에 맞는 객체가 없거나 두개 이상일 경우 예외를 발생시킨다.

 

@Autowired 어노테이션을 적용한 프로퍼티를 반드시 설정할 필요가 없는 경우에는 @Autowired 어노테이션의 required속성 값을 false로 지정한다.

@Autowired(required=false)

 

이렇게 지정된 경우에는 해당 타입에 맞는 빈객체가 존재하지 않는다고 해도 예외를 발생시키지는 않는다.

 

@Qualifier

: 동일한 타입의 빈객체들 중 특정 빈 객체를 자동으로 설정하도록 한다.

: @Autowired 어노테이션과 함께 사용되며 자동 연결될 빈객체의 수식어를 값으로 갖는다.

 

public class TestBean {

    @Autowired

    @Qualifier("main")

    private TestDao testDao;

}

위 코드에서 수식어구는 main 이고

이러한 수식어는 설정파일에서 <qualifer> 태그를 이용하여 설정한다.

 

<bean id="testDao" class="lja.test.TestDao">

    <qualifier value="main"/>

</bean>

  • @Resource
    JSR-250 표준 Annotation으로 Spring Framework 2.5.* 부터 지원하는 Annotation이다. @Resource는 JNDI 리소스(datasource, java messaging service destination or environment entry)와 연관지어 생각할 수 있으며, 특정 Bean이 JNDI 리소스에 대한 Injection을 필요로 하는 경우에는 @Resource를 사용할 것을 권장한다.

  • @Inject
    JSR-330 표준 Annotation으로 Spring 3 부터 지원하는 Annotation이다. 특정 Framework에 종속되지 않은 어플리케이션을 구성하기 위해서는 @Inject를 사용할 것을 권장한다. @Inject를 사용하기 위해서는 클래스 패스 내에 JSR-330 라이브러리인 javax.inject-x.x.x.jar 파일이 추가되어야 함에 유의해야 한다.

@Autowired, @Resource, @Inject를 사용할 수 있는 위치는 다음과 같이 약간의 차이가 있으므로 필요에 따라 적절히 사용하면 된다.
  • @Autowired : 멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능
  • @Resource : 멤버변수, setter 메소드에 적용가능
  • @Inject : 멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능

@Autowired, @Resource, @Inject를 멤버변수에 직접 정의하는 경우 별도 setter 메소드는 정의하지 않아도 된다.

※ spring 3.0 공부 중에 책의 설명을 보면 @Autowired @Resource 두개 모두 내가보기엔 똑같은 연결을 한다.(내 생각일뿐...)
    이해가 안되서 인터넷 뒤져서 설명을 찾긴 했는데... 그래도 큰 차이점을 모르겠다. 그냥 일반메소드에는 @Resource 가
    적용이 안된다는 점정도? 아직 부족한가보다...


+ Recent posts