본문 바로가기
카테고리 없음

[petclinic] 의존성 주입

by minux_s 2020. 11. 25.
728x90

1) @Autowired

오토와이어드를 사용할 수 있는 지점은 많다! 필드, 세터?, 생성자에도 사용할 수 있다.

스프링4.3부터 어떠한 클래스에 생성자가 하나뿐이고, 그 생성자로 주입받는 레퍼런스 변수들이 BEAN으로 등록되어있다면, 그 BEAN을 자동으로 주입해주도록 스프링 프레임워크에 기능이 추가되어, @Autowired를 생략 가능!!! 4.3 이상부터는!!

 

생성자로 의존성을 주입받는 것이 아니라 필드로 주입받고 싶다면

 

private final OwnerRepository owners;

public OwnerController(OwnerRepository clinicService){
     this.owners = clinicService;
}

-> 

@Autowired
private OwnerRepository owners;    <- 필드에 바로 주입받는 방법

이렇게 고친다.

 

또는

private OwnerRepository owners;

@Autowired

public void setOwners(OwnerRepository owners){
     this.owners = owners;
}

 

setter 방식으로 바꾸기도 가능

이러면 스프링 IOC container가 이 인스턴스를 만들고나서 setter를 통해서 IOC Container가 가지고 있는 bean 중에서 ownerRepository를 찾아서 넣어준다.

 

의존성 주입이 만족안하면 No qualifying bean of type ~~ 에러가 뜸

 

생성자,필드,setter 이렇게 3가지중에서 뭘 사용할거냐, 일단 스프링 프레임워크 레퍼런스에서 권장하는 방법은 생성자!

생성자를 사용하는 방법이 좋은 이유는 필수적으로 사용해야하는 레퍼런스 없이는 이 인스턴스를 만들지 못하도록 강제할 수 있다. 

필드나 setter는 이 인스턴스를 일단 만들 수 있다.

 

순환참조,,,A가 B를 참조,B가 A를 참조 할 경우....생성자 인젝션 대신 setter나 필드 인젝션을 사용하면 인스턴스를 만든 다음에 서로 인스턴스를 주입할 수 있어서 해결 가능하다.

 

[ownercontroller에 petrepository 주입하기!]

@Autowired 
private RetRepository petRepository;   

또는

(생성자)
private final PetRepository petRepository;

public OwnerContorller(OwnerRepository clinicService,PetRepository petRepository){
     this.owners = clinicService;
}

또는

(setter)
private PetRepository petRepository;

@Autowired
public void setPetRepository (PetRepository petRepository){
     this.petRepository = petRepository;
}

public OwnerContorller(OwnerRepository clinicService){
     this.owners = clinicService;
}
728x90

댓글