Spring & Spring Boot
DI_7_dependencyChange
minNa2
2023. 7. 4. 18:32
AppleSpeaker.java
package org.joonzis.DI_7_dependencyChange;
public class AppleSpeaker implements Speaker {
public AppleSpeaker() {
System.out.println("--> AppleSpeaker 객체 생성");
}
@Override
public void volumeUp() {
System.out.println("--> AppleSpeaker 소리 올린다");
}
@Override
public void volumeDown() {
System.out.println("--> AppleSpeaker 소리 내린다");
}
}
SonySpeaker.java
package org.joonzis.DI_7_dependencyChange;
public class SonySpeaker implements Speaker {
public SonySpeaker() {
System.out.println("--> SonySpeaker 객체 생성");
}
@Override
public void volumeUp() {
System.out.println("--> SonySpeaker 소리 올린다");
}
@Override
public void volumeDown() {
System.out.println("--> SonySpeaker 소리 내린다");
}
}
Speaker.java
package org.joonzis.DI_7_dependencyChange;
public interface Speaker {
public void volumeUp();
public void volumeDown();
}
SamsungTV.java
package org.joonzis.DI_7_dependencyChange;
public class SamsungTV implements TV {
// SamsungTV 클래스의 볼륨 조절 기능을 SonySpeaker 클래스를 이용
private Speaker speaker;
private int price;
public SamsungTV() {
System.out.println("--> SamsungTV 객체(1) 생성");
}
public SamsungTV(Speaker speaker) { // sony가 매개변수(samsung 사용하려면 sony 있어야함)
System.out.println("--> SamsungTV 객체(2) 생성");
this.speaker = speaker; // 객체 생성
}
public SamsungTV(Speaker speaker, int price) {
System.out.println("--> SamsungTV 객체(3) 생성");
this.speaker = speaker;
this.price = price;
}
@Override
public void powerOn() {
System.out.println("--> SamsungTV 전원 켠다 (가격 : " + price + ")");
}
@Override
public void powerOff() {
System.out.println("--> SamsungTV 전원 끈다");
}
@Override
public void volumeUp() {
speaker.volumeUp();
}
@Override
public void volumeDown() {
speaker.volumeDown();
}
}
TV.java
package org.joonzis.DI_7_dependencyChange;
public interface TV {
public void powerOn();
public void powerOff();
public void volumeUp();
public void volumeDown();
}
TVUser.java
package org.joonzis.DI_7_dependencyChange;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVUser {
public static void main(String[] args) {
// 1. Spring 컨테이너 구동
AbstractApplicationContext ctx =
new GenericXmlApplicationContext("applicationContext7.xml");
// sony 만들어지고 samsung 만들어짐
TV stv = (SamsungTV)ctx.getBean("stv");
System.out.println("------------------------");
stv.powerOn();
stv.volumeUp();
stv.volumeDown();
stv.powerOff();
}
}
applicationContext7.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!--
생성자가 여러 개 오버로딩 되었을 때, 어떤 생성자를 호출해야 할지 불분명하면,
index 속성을 이용하여 매개변수 맵핑을 한다.
-->
<bean id="stv" class="org.joonzis.DI_7_dependencyChange.SamsungTV">
<!-- 매개변수의 순서대로 들어간다고 보장할 수 없음(에러 있을 수도 없을 수도) 그래서 index로 명시해줘야함 -->
<constructor-arg index="0" ref="sony" />
<constructor-arg index="1" value="27000" /> <!-- price에 대한 값, ref: 객체를 참조하기 위해 사용 -->
</bean>
<bean id="sony" class="org.joonzis.DI_7_dependencyChange.SonySpeaker"></bean>
<bean id="apple" class="org.joonzis.DI_7_dependencyChange.AppleSpeaker"></bean>
</beans>
반응형