변경에 의해 영향 받는 관계를 의미한다. 변경에 따른 영향이 전파되는 관계.
객체 간의 의존.
i) 객체를 직접 생성
ii) DI의 서비스 로케이터.(의존하는 객체를 직접 생성하는 대신 의존 객체를 전달받는 걸 의미)
class A {
private ClassB b;
// 이렇게 주입받는 걸 말한다.
생성자(ClassB b) {
}
}
어플리케이션 실행시점(런타임)에 외부에서 실제 구현 객체를 생성하고, 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는것
(1) 필드 주입
@Autowired
private OwnerRepository owners;
(2) 생성자 주입
@Autowired
public 클래스이름(OwnerRepository ownerRepo) {
}
필수적으로 생성해야 하는 참조 없이는 인스턴스를 만들 수 없게 된다.
생성자가 딱 1개 있으면 @Autowired를 생략해도 자동주입된다.
final을 붙일 수도 있고, 안 붙일 수도 있으나 이점은 해당 클래스 내부에서는 바꿔치기가 불가능하다는 점이다.
(3) setter 주입
@Autowired
public void setOwners(OwnerRepository ownerRepo) {
this.repo = repo;
}
기본 조회 전략은 (1순위) 타입이 같은 빈을 찾아서 주입한다.
1) @Autowired(required = false)
아예 수정자 메소드 호출되지 않음
2) org.springframework.lang @Nullable
없으면 null로 처리
3) Optional<>
없으면 Optional.empty (java 문법)
1) Autowired 필드명 매핑
2) @Qualifier
3) @Primary
@Primary가 사용에는 편리하나 우선순위는 @Qualifier가 더 높다.
기본은 리플렉션을 이용한다.
접근 지시자를 무시하고 필드이름, 필드 값, 메소드, 생성자, 상위클래스를 가져올 수 있다.
클래스를 로딩만해도 바로 사용할 수 있다.
리플렉션 사용 시 지나친 사용은 성능 이슈가 발생할 수 있으므로 주의해야 한다.