특정 Bean의 기능 수행을 위해 다른 Bean을 참조해야 하는 경우 사용하는 Annotation으로는 @Autowired, @Resource 그리고 @Inject가 있다.
의존관계를 자동으로 설정해주는 어노테이션
: 타입을 이용하여 의존객체를 자동으로 설정한다.
: 생성자, 필드, 메서드 세곳에 적용 가능하다.
예) 프로퍼티 설정 메서드 이용
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 가
적용이 안된다는 점정도? 아직 부족한가보다...