생정자 주입
수정자 주입(setter 주입)
필드 주입
일발 메서드 주입
@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;
}
}
@Autowired
를생략해도 자동 주입된다setter
라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPlicy(DiscountPolicy discountPolicy){
this.discountPolicy = discountPolicy;
}
}
@Autowired
의 기본 동작은 주입할 대상이 없으면 오류가 발생한다. 주입할 대상이 없어도 동작하게 하려면 @Autowired(reqired = false)
로 지정하면 된다.@Component
public class OrderServiceImpl implements OrderService{
@Autowired private final MemberRepository memberRepository;
@Autowired private final DiscountPolicy discountPolicy;
}
일반 메서드를 통해서 주입
특징
한번에 여러 필드를 주입 받을 수 있다.
의존관계 자동 주입인 스프링 컨테이너가 관리하는 스프링 빈이어야동작한다.
@Autowired
코드를 정용해도 아무 기능도 동작하지 않음.자동 주입 대상을 옵션으로 처리
@Autowired(required=false)
: 자동주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨
org.springframework.lang.@Nullable
: 자동 주입할 대상이 없으면 null이 입력
Optional<>
: 자동 주입할 대상이 없으면 Optional.empty
가 입력
public class AutowiredTest {
@Test
@DisplayName("autowiredOption")
void autowiredOption(){
ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
}
static class TestBean{
@Autowired(required = false)
public void setNoBean1(Member member){
System.out.println("member1 = " + member);
}
@Autowired
public void setNoBean2(@Nullable Member member){
System.out.println("member2 = " + member);
}
@Autowired
public void setNoBean3(Optional<Member> member){
System.out.println("member3 = " + member);
}
}
}