1. 특징

    1. 스프링 컨테이너에 등록한 빈에게 의존관계주입이 필요할 때, DI(의존성 주입)을 도와주는 어노테이션이다.
    2. 스프링 컨테이너가 빈들을 모두 등록한 후에, 의존성 주입 단계가 이루어진다. 이때 이 어노테이션이 부여된 메서드가 실행되면 필요한 인스턴스를 주입한다.
    3. 이 어노테이션은 생성자, 수정가, 필드를 사용할수 있다.
  2. 생성자 주입

    1. 생성자를 통해 의존관계를 주입하는 방법이다.
    2. 객체가 생성될 때 딱 한번 호출되는 것이 보장된다. > 의존관계가 변하지 않는 경우, 필수 의존관계에 사용
    3. 의존 관계에 있는 객체들을 final로 선언할 수 있다는 장점 > 생성자에서 무조건 설정해주어야 함 > 누락발생 x
    4. 생성자가 하나일 경우 @ Autowired를 생략할 수 있다.
    5. Spring 4.3 버전 이후부터 생성자가 딱 1개만 있으면 이 어노테이션 생략 가능
  3. 예)

    @Component
    public class OrderServiceImpl implements OrderService{
    	private final MemberRepository memberRepository;
    	private final DiscountPolicy discountPolicy;
    	@Autowired
    	public OrderServiceImpl (MemberRepository memberRepository, DiscountPolicy discountPolicy){
    		this.memberRepository = memberRepository;
    		this.discountPolicy = discountPolicy;
    	}
    }
    
  4. 수정자 주입

    1. setter를 생성하고, 그 위에 @Autowired를 적는다.
    2. 스프링 빈을 모두 등록한 수에 @Autowired가 붙은 수정자를 모두 찾아서 의존관계를 주입한다.
    3. “선택적”이고, “변화 가능”한 의존 관게에 사용한다.
    @Component
    public class OrderServiceImpl implements OrderService{
    	private MemberRepository memberRepository;
    	private DiscountPolicy discountPolicy;
    	
    	@Autowired
    	public void setMemberRepository(MemberRepository memberRepository){
    		this.memberRepository = memberRepository;
    	}
    	
    	@Autowired
    	public void setDiscountPolicy(DiscountPolicy discountPolicy){
    		this.discountPolicy = discountPolicy;
    	}
    }
    
  5. 필드주입

    1. 변수에 @Autowired를 붙여서 사용한다.
    2. 하지만 단점이 너무 많다. 어플리케이션과 관련이 없는 테스트 코드에서만 한정적으로 사용한다.
    @Component
    public class OrderServiceImpl implements OrderService{
    	@Autowired
    	private MemberRepository memberRepository;
    	@Autowired
    	private DiscountPolicy discountPolicy;
    }