의존성 주입(Dependency Injection) 관련

@Autowired
의존성 주입(Dependency Injection)을 수행
- 필드 주입(Field Injection)
- 생성자 주입(Constructor Injection)
- Setter 메서드 주입(Setter Method Injection)
//필드 주입(Field Injection)
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
// ...
}
//생성자 주입(Constructor Injection)
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
//Setter 메서드 주입(Setter Method Injection)
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
@Inject
Spring Framework의 @Autowired와 같이 의존성 주입(Dependency Injection)을 위한 자바 표준(JSR-330)에서 정의
@Autowired가 SpringContext 내에서만 작동하는 것과는 달리 JSR-330에 따라서 자바의 의존성 주입(DI)을 지원하는 모든 컨테이너에서 사용
//@Inject 사용 예제
import javax.inject.Inject;
@Service
public class UserService {
private final UserRepository userRepository;
@Inject
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
//@Autowired 사용 예제
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
@Resource
JSR-250에 정의된 의존성 주입(Dependency Injection)을 위한 어노테이션
생성자 주입(Constructor Injection)을 명시적으로 지원하는 기능은 없음
특정 Framework에 종속적인 어플리케이션을 구성하지 않기 위해서 권장됨
import jakarta.annotation.Resource;
//필드 주입(Field Injection)
@Service
public class UserService {
@Resource
private UserRepository userRepository;
// ...
}
//Setter 메서드 주입(Setter Method Injection)
@Service
public class UserService {
private UserRepository userRepository;
@Resource
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
//이름으로 빈 선택
@Service
public class PrintService {
@Resource(name = "bluePrinter")
private Printer printer;
// ...
}
@Qualifier
빈(bean) 주입 시에 어떤 빈을 사용할지 명시적으로 지정
동일한 타입의 빈이 여러 개 정의되어 있을 때 어떤 빈을 주입할지를 선택
public interface Animal {
void sound();
}
@Component
@Qualifier("cat")
public class Cat implements Animal {
public void sound() {
System.out.println("야옹");
}
}
@Component
@Qualifier("dog")
public class Dog implements Animal {
public void sound() {
System.out.println("멍멍");
}
}
@Service
public class AnimalService {
private final Animal cat;
private final Animal dog;
public AnimalService(@Qualifier("cat") Animal cat, @Qualifier("dog") Animal dog) {
this.cat = cat;
this.dog = dog;
}
public void makeSounds() {
cat.sound(); // "야옹" 출력
dog.sound(); // "멍멍" 출력
}
}
'learn > spring' 카테고리의 다른 글
어노테이션 (Annotation) - AOP(Aspect-Oriented Programming) 관련 (0) | 2023.09.26 |
---|---|
어노테이션(Annotation) - 설정(Configuration) 관련 (0) | 2023.09.21 |
어노테이션(Annotation) - 컴포넌트 스캔(Component Scan) 관련 (0) | 2023.09.21 |
빈 (Bean) (2) | 2023.09.21 |
스프링 컨테이너 (Spring Container) (0) | 2023.09.19 |