[Spring] 의존성 주입 애노테이션 @Autowired @Resource @Inject
의존성 주입 애노테이션 - @Autowired @Resource @Inject
의존 객체 자동 주입은 스프링 설정 파일에서 <constructor-arg> 또는 <property> 태그로 의존 객체 대상을 명시하지 않아도 스프링 컨테이너가 자동적으로 의존 대상 객체를 찾아 해당 객체에 필요한 의존성을 주입하는 것을 말한다.
이를 구현하는 방법은 @Autowired, @Resource, @Inject 애노테이션 등을 사용하여 구현한다.
1. @Autowired
@Autowired는 주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입한다.
@Autowired는 필드, 생성자, Setter에 붙일 수 있다.
Type => Qualifier => Name
1) @Autowired 필드주입
public class UserService {
@Autowired
private UserRepository userRepository;
public UserService() {
}
}
2) @Autowired 생성자 주입
public class UserService {
private UserRepository userRepository;
@Autowired
public UserService (UserRepository userRepository) {
this.userRepository = userRepository;
}
}
3) @Autowired Setter 주입
public class UserService {
private UserRepository userRepository;
public UserRepository() {
}
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
4) @Qualifier 애노테이션
XML 설정 파일
<bean id="userRepository1" class="com.user.repository.UserRepository">
<qualifier value="userRepository"/>
</bean>
<bean id="userRepository2" class="com.user.repository.UserRepository"/>
<bean id="userRepository3" class="com.user.repository.UserRepository"/>
위와 같이 동일한 타입의 빈 객체가 여러개 정의되어 있을 경우 우선적으로 사용할 빈 객체의 <bean> 태그 하위에 <qualifier> 태그를 설정한다.
자바코드
public class UserService {
@Autowired
@Qualifier("userRepository")
private UserRepository userRepository;
public UserService() {}
}
자바 코드에서는 @Autowired와 함께 @Qualifier를 사용해서 @Qualifier에 XML 설정파일에서 설정한 <qualifier> 태그의 value 값을 지정해준다.
이렇게 하면 동일한 타입의 빈이 여러 개일 경우 우선적으로 특정 빈이 주입된다.
2. @Resource
@Resource는 주입하려고 하는 객체의 이름(id)이 일치하는 객체를 자동으로 주입한다.
@Resource는 Java가 제공하는 애노테이션이며 필드, Setter에 붙일 수 있지만 생성자에는 붙일 수 없다.
Name => Type => Qualifier
1) 의존성 설정
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
프로젝트에서 사용하기 위해 javax.annotation-api 의존성을 추가한다.
2) @Resource 필드 주입
import javax.annotation.Resource;
public class UserService {
@Resource
private UserRepository userRepository;
public UserService() {}
}
3) @Resource Setter 주입
import javax.annotation.Resource;
public class UserService {
private UserRepository userRepository;
public UserService() {}
@Resource
public setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
3. @Inject
@Inject는 @Autowired와 유사하게 주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입한다.
Type => Qualifier => Name
1) 의존성 설정
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
프로젝트에서 사용하기 위해 javax.inject 의존성을 추가한다.
2) @Inject 필드 주입
import javax.inject.Inject;
public class UserService {
@Inject
private UserRepository userRepository;
public UserService() {}
}
3) @Inject 생성자 주입
import javax.inject.Inject;
public class UserService {
private UserRepository userRepository;
@Inject
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
4) @Inject Setter 주입
import javax.inject.Inject;
public class UserService {
private UserRepository userRepository;
public UserService() {}
@Inject
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
5) @Named 애노테이션
@Autowired의 @Qualifier과 같이 사용할 수 있는 것이 @Inject에서는 @Named이다.
@Qualifier과 달리 @Named에는 빈 이름(id)를 지정하므로 @Autowired, @Qualifier를 사용할 때에 비해 XML 설정 파일이 다소 짧아진다는 특징이 있다.
XML 설정 파일
<bean id="userRepository1" class="com.user.repository.UserRepository">
<bean id="userRepository2" class="com.user.repository.UserRepository">
<bean id="userRepository3" class="com.user.repository.UserRepository">
<qualifier> 태그가 필요한 @Qualifier과 달리 @Named는 XML 설정 파일에 추가적으로 설정할 것이 없다.
자바코드
import javax.inject.Inject;
import javax.inject.Named;
public class UserService {
@Inject
@Named("userRepository1")
private UserRepository userRepository;
public UserService() {
}
}
참고
https://www.baeldung.com/spring-annotations-resource-inject-autowire
'web > Spring' 카테고리의 다른 글
[JSP] formatNumber, formatDate 확장 태그 (2) | 2021.11.25 |
---|---|
[Spring Web MVC] 컨트롤러 클래스, 뷰 구현 (2) | 2021.11.24 |
[Spring JPA] QueryDsl와 Gradle 그리고 AnnotationProcessor (4) | 2021.02.19 |
[Spring JPA/Rest API/AWS] 1. Spring Boot 프로젝트 생성 및 설정 (2) | 2020.05.09 |
[Spring JPA] @RestController / @ResponseBody / @RequestBody (0) | 2020.05.04 |
댓글 개