@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;
}
}
class Data {
private int age;
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
@Configuration
public class AutoAppConfig {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
@Bean
OrderService orderService() {
return new OrderServiceImpl(memberRepository, discountPolicy);
}
}
public class OrderServiceTest {
// 순수한 자바 코드에서는 NPE이 발생한다.
@Test
void fieldInjectionTest() {
OrderServiceImpl orderService = new OrderServiceImpl();
orderService.createOrder(1L, "itemA", 1000);
}
}
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
public class AutowiredTest {
@Test
void autowiredOption() {
// TestBean을 스프링 빈으로 등록한다.
AnnotationConfigApplicationContext ac =
new AnnotationConfigApplicationContext(TestBean.class);
}
static class TestBean {
// 호출 안됨
// true면 찾을 수 없다고 오류가 뜬다.
@Autowired(required = false)
public void setNoBean1(Member member) {
System.out.println("setNoBean1 = " + member);
}
// null 호출
@Autowired
public void setNoBean2(@Nullable Member member) {
System.out.println("setNoBean2 = " + member);
}
// Optional.empty 호출
@Autowired(required = false)
public void setNoBean3(Optional<Member> member) {
System.out.println("setNoBean3 = " + member);
}
}
}
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;
}
}
public class OrderServiceTest {
// 스프링 없이 순수한 자바 코드로 직접 구현체를 주입해서 테스트 하는 방식이라
// 의존 관계가 없어도 `@Autowired` 관련 오류가 발생하지 않는다.
@Test
void createOrder() {
// memberRepository와 discountPolicy의 의존 관게 주입이 누락되어 NPE가 발생한다.
// 생성자 주입을 사용했다면 컴파일 오류가 발생하므로 바로 알 수 있다.
OrderServiceImpl orderService = new OrderServiceImpl(/* 누락됨 */);
orderService.createOrder(1L, "itemA", 10000);
}
}
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
}
}