javaboiii의 Error | Exception

Exception - UnsatisfiedDependencyException

javaboiii 2024. 10. 4. 10:42

Exception

DI 모호성 에러

@Component("apple")
public class IPhone implements Phone {
	@Autowired // 메모리의 자료형(타입)을 인지해서 주입해줌
	// 주입대상 모호성 에러
	///// @Qualifier("aw")
	private Watch watch; // 의존 주입 대상(DI 대상
	
	public IPhone() {
		System.out.println("아이폰 객체 생성 01");
	}
	/*
	public IPhone(Watch watch) {
		this.watch=watch;
		System.out.println("아이폰 객체 생성 02");
	}
	public IPhone(Watch watch,int num) {
		this.watch=watch;
		this.num=num;
		System.out.println("아이폰 객체 생성 03");
	}
	*/
	@Override
	public void powerOn() {
		this.watch.powerOn();
	}
	@Override
	public void powerOff() {
		this.watch.powerOff();
	}	
	
	public Watch getWatch() {
		return watch;
	}
	public void setWatch(Watch watch) {
		this.watch = watch;
	}
}
@Component("galaxy")
public class GalaxyPhone implements Phone {
	@Autowired // 메모리의 자료형(타입)을 인지해서 주입해줌
	///// @Qualifier("gw")
	private Watch watch;
	
	public GalaxyPhone() {
		System.out.println("갤럭시 객체 생성 01");
	}
	public GalaxyPhone(Watch watch) {
		this.watch=watch;
		System.out.println("갤럭시 객체 생성 02");
	}

	@Override
	public void powerOn() {
		this.watch.powerOn();
	}
	@Override
	public void powerOff() {
		this.watch.powerOff();
	}
	
	public Watch getWatch() {
		return watch;
	}
	public void setWatch(Watch watch) {
		this.watch = watch;
	}
	
}

 

두 객체 다

동일 이름의 Watch를 호출 하고 있음

 

Autowired는 메모리 자료형(타입)만을 구분해서 호출하기 때문에

 

어떤 Watch를 호출해야할지 모르는 것임

 

해결 방법으로는 

 

@Qualifier을 사용할 수 있음

객체의 이름을 명시 해 어떤 Watch를 주입할 지 설정할 수 있음

 

.xml 의 bean 작성은 설정 파일이기 때문에 비용이 들지 않음

@어노테이션은 컴파일 해야하기 때문에 비용이 듦