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
댓글