생성자 주입

public class OrderServiceImpl {

		private final MemberRepository memberRepository;
		private final DiscountPolicy discountPolicy;

		@Autowired // 생략 가능
		public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discount policy) {
				this.memberRepository = memberRepository;
				this.discountPolicy = discountPolicy;
		}
		
		...
}

수정자 주입(setter 주입)

public class OrderServiceImpl {

		private MemberRepository memberRepository;
		private DiscountPolicy discountPolicy;

		@Autowired
		public void setMemberRepository(MemberRepository memberRepository) {
				this.memberRepository = memberRepository;
		}

		@Autowired
		public void setDiscountPolicy(DiscountPolicy discountPolicy) {
				this.discountPolicy = discountPolicy;
		}

		...
}

참고) @Autowired 의 기본 동작은 주입할 대상이 없으면 오류가 발생한다. 주입할 대상이 없어도 동작하게 하려면 @Autowired(requierd = false) 로 지정한다.

필드 주입

public class OrderServiceImpl {

		@Autowired
		private MemberRepository memberRepository;

		@Autowired
		private DiscountPolicy discountPolicy;

		...
}

일반 메서드 주입

public class OrderServiceImpl {

		private MemberRepository memberRepository;
		private DiscountPolicy discountPolicy;

		@Autowired
		public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
				this.memberRepository = memberRepository;
				this.discountPolicy = discountPolicy;
		}

		...
}

참고) 의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다. 스프링 빈이 아닌 Member 같은 클래스에서 @Autowired 코드를 적용해도 아무 기능도 동작하지 않는다.