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

관련 채용 정보