IOC ,DI 생성자

jinkyung·2021년 2월 9일
0

Spring

목록 보기
4/24

IOC

: Inversion Of Control (제어의 역전)
객체에 대한 제어권이 개발자에게 있는 것이 아니라 컨테이너에게 있다.

DI

: 객체를 외부에서 주입한다

  • 생성자 이용
    configuration 파일을 이용하여 주입

SonySpeaker

package polymorphism;

public class SonySpeaker {
	
	public SonySpeaker() {
		System.out.println("===> SonySpeaker 객체 생성 ");
	}
	
	public void volumeUp() {
		System.out.println("SonySpeaker -- 소리 올린다 ");
	}
	
	public void volumeDown() {
		System.out.println("SonySpeaker -- 소리 내린다 ");
	}
}


SamsungTV

package polymorphism;

// 생성자를 이용해서 DI 
public class SamsungTV implements TV {
	
	private SonySpeaker speaker;
	
	public SamsungTV(SonySpeaker speaker) {
		System.out.println("SamsungTV -- 객체 생성...");
		this.speaker = speaker;
	}
	
	public void powerOn() {
		System.out.println("SamsungTV -- 전원 켠다");
	}

	public void powerOff() {
		System.out.println("SamsungTV -- 전원 끈다");
	}

	public void volumeUp() {
		speaker.volumeUp();
	}

	public void volumeDown() {
		speaker.volumeDown();
	}
}

TVUser

package polymorphism;



import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class TVUser {
	static BeanFactory factory = new BeanFactory();
	
	public static void main(String[] args) {
		
		AbstractApplicationContext factory = 
				new GenericXmlApplicationContext("applicationContext.xml");
		
		TV tv = (TV)factory.getBean("tv");
		
		tv.volumeUp();
		tv.volumeDown();
		
		factory.close();   
	}
}


  • 생성자의 매개변수로 여러개를 줄 수도 있다
package polymorphism;

// 생성자를 이용해서 DI 
public class SamsungTV implements TV {
	
	private SonySpeaker speaker;
	private int price;
	
	public SamsungTV(SonySpeaker speaker, int price ) {
		System.out.println("SamsungTV -- 객체 생성...");
		this.speaker = speaker;
		this.price = price;
	}
	
	public void powerOn() {
		System.out.println("SamsungTV -- 전원 켠다(가격 : " + price + ")");
	}

	public void powerOff() {
		System.out.println("SamsungTV -- 전원 끈다");
	}

	public void volumeUp() {
		speaker.volumeUp();
	}

	public void volumeDown() {
		speaker.volumeDown();
	}
}

등록한 매개변수에 인덱스를 주어 순서를 명확하게 할 수도 있다
주지 않으면 쓰여진 순서대로 쓴다
(int는 value 타입 / 객체는 ref 참조타입)


DI interface

speaker interface 만들기

AppleSpeaker 클래스 만들기

SamsungTV 클래스 스피커 수정

ref에 apple로 변경

sony 객체도 생성하지만 SamsungTV에는 apple을 주입했으므로 appleSpeaker의 동작이 실행된다.

0개의 댓글