import org.springframework.stereotype.Component;
@Component
public class MyService {
private final DependencyComponent dependency;
// @Autowired 가 없어도 스프링이 DI를 자동으로 해준다.
public MyService(DependencyComponent dependency) {
this.dependency = dependency;
}
}
필수적으로 사용해야 하는 reference 없이는 생체생성을 못하도록 강제할 수 있다.
field injection이나 setter injection은 필수 의존성이 없이 도 일단 객체를 만들수는 있게 된다.
A, B 객체가 서로 참조하고 있는 경우, 생성자주입 방식을 이용하면 순환참조 문제가 발생할 수 있다. 이럴경우는 setter 방식이나,필드 주입방식을 고려해 볼 수 있지만, 대부분의 경우는 생성자 방식을 고려하는 것을 추천한다.
@Autowired(required=false) :: 자동 주입할 대상이 없으면 수정자 메소드 호출 자체가 안됨
org.springframework.lang.@Nullable : 자동주입할 대상이 없으면 null 이 입력된다.
Optional<> : 자동 주입할 대상이 없으면 Optional.empty가 입력됨
@Autowired 는 타입매칭을 시도한후, 빈이 여러개 있는 경우, 필드이름, 파라미터 이름을 추가로 매칭시도 한다.
빈에 등록된 같은 타입의 여러 객체르 한번에 Map, 이나 List를 활용해 주입받을 수 있다. 전략패턴을 매우 간략하게 구사할 수 있다.
@Component
public class DiscountService{
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policyList;
@Autowired
public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policyList){
this.policyMap = policyMap;
this.policyList = policyList;
System.out.println("policyMap = " + policyMap);
System.out.println("policyList = " + policyList);
}
}