learn/spring

어노테이션(Annotation) - 의존성 주입(Dependency Injection) 관련

사겅이 2023. 9. 21. 05:47

의존성 주입(Dependency Injection) 관련

출처 : https://gmlwjd9405.github.io/2018/11/09/dependency-injection.html

@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(); // "멍멍" 출력
    }
}