package polymorphism;
public interface TV {
public void powerON();
public void powerOff();
public void volumUp();
public void volumDown();
}
package polymorphism;
public class SamsungTV implements TV{
private Speaker speaker;
private int price;
// init-Method 속성으로 지정된 initMethod 메서드 맴버변수 초기화
public void initMethod() {
System.out.println("객체 초기화 작업 처리.");
}
/*
public void destroyMethod() {
System.out.println("객체 삭제 전에 처리할 로직 처리....");
}*/
// 생성자 인젠션 테스트용 생성자 생성
public SamsungTV() {
System.out.println("===> SamsungTV(1) 객체 생성");
}
// Setter 인젝션 사용시 기본생성자만 있으면 됨 밑에 2개의 생성자가 살아있으면 NotWritablePropertyException 오류가남
/*public SamsungTV(Speaker speaker) {
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;
}*/
// Setter injection 이용
// Setter 메서드는 스프링 컨테이너가 자동으로 호출하며 호출하는 시점은<bean> 객체 생성 직후입니다.
// 따라서 Setter인젝션이 동작하려면 Setter 메서드뿐만 아니라 기본 생성자도 반드시 필요합니다.
public void setSpeaker(Speaker speaker) {
this.speaker = speaker;
System.out.println("===> setSpeaker() 호출");
}
public void setPrice(int price) {
this.price = price;
System.out.println("===> setPrice() 호출");
}
@Override
public void powerON () {
System.out.println("SamsungTV --- 전원 켠다.(가격 : " + price + ")");
}
@Override
public void powerOff() {
System.out.println("SamsungTV --- 전원 끈다.");
}
@Override
public void volumUp() {
// speaker = new SonySpeaker();
speaker.volumUp();
}
@Override
public void volumDown() {
// speaker = new SonySpeaker();
speaker.volumDown();
}
}
package polymorphism;
public class LgTV implements TV{
@Override
public void powerON () {
System.out.println("LgTV --- 전원 켠다.");
}
@Override
public void powerOff() {
System.out.println("LgTV --- 전원 끈다.");
}
@Override
public void volumUp() {
System.out.println("LgTV --- 소리 올린다.");
}
@Override
public void volumDown() {
System.out.println("LgTV --- 소리 내린다.");
}
}
package polymorphism;
public interface Speaker {
void volumUp();
void volumDown();
}
package polymorphism;
public class AppleSpeaker implements Speaker {
public AppleSpeaker() {
System.out.println("===>AppleSpeaker 객체 생성");
}
@Override
public void volumUp() {
System.out.println("AppleSpeaker---소리 울린다");
}
@Override
public void volumDown() {
System.out.println("AppleSpeaker---소리 내린다");
}
}
package polymorphism;
public class SonySpeaker implements Speaker{
public SonySpeaker() {
System.out.println("===> SonySpeaker 객체 생성");
}
@Override
public void volumUp() {
System.out.println("SonySpeaker === 소리 올린다.");
}
@Override
public void volumDown() {
System.out.println("SonySpeaker === 소리 내린다.");
}
}
package polymorphism;
public class BeanFactory {
// Factory 패턴
// = 클라이언트에서 사용할 객체 생성을 캡슐화하여
// TVUser와 TV사이를 느슨한 결합 상태로 만들어줍니다.
public Object getBean(String beanName) {
if(beanName.equals("Samsung")) {
return new SamsungTV();
} else if (beanName.equals("Lg")) {
return new LgTV();
}
return null;
}
// getBean 메서드는 매개변수로 받은 beanName에 해당하는 객체를 생성하여 리턴합니다.
// TVUser 클래스를 수정해야함
}
package polymorphism;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVUser {
public static void main(String[] args) {
// 1.스프링 컨테이너를 구동합니다.
AbstractApplicationContext factory =
new GenericXmlApplicationContext("applicationContext.xml");
// GenericXmlApplicationContext = 파일 시스템이나 클래스 경로에 있는 xml 설정 파일을 로딩하여 구동하는 컨테이너 입니다.
// 환경 설정 파일인 applicationContext 파일을 로딩하여 스프링 컨테이너 중 하나인
// GenericXmlApplicationContext를 구동합니다.
// TV tv = new SamsungTV();
// BaenFactory
// BeanFactory factory = new BeanFactory();
// 2. 스프링 컨테이너로 부터 필요한 객체를 요청(Look Up) 합니다.
TV tv = (TV)factory.getBean("tv"); // applicationContext에서 빈아이디 tv로 성정한거를 적용해줘야함
// 매개변수를 넣어주면 원하는 Tv가 출력됨
tv.powerON();
tv.powerOff();
tv.volumDown();
tv.volumUp();
// 3. 스프링 컨테이너를 종료한다.
factory.close();
}
}
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="tv" class="polymorphism.SamsungTV" p:speaker-ref="sony" p:price="2700000" />
<!-- <<< p네임스페이스 -->
<!-- p:변수명-ref="참조할 객체의 이름이나 아이디" 기본형이나 문자형 변수에 직접 값을 설정할때 p:변수명="설정할 값"-->
<!-- <constructor-arg index="0" ref="sony" /> -->
<!-- <constructor-arg> 엘리먼트 매개변수의 개수만큼 추가해야합니다. -->
<!-- <constructor-arg ref="sony" /> -->
<!-- <constructor-arg ref="apple" /> -->
<!-- Setter 인젝션을 사용하려면 property를 사용해야합니다. -->
<!-- Setter 인젝션을 설정할 때. 'p'네임스페이스를 이용하면 좀 더 효율적으로 의존성 주입을 처리 할 수 있습니다. -->
<!-- <property name="speaker" ref="apple" /> -->
<!-- Setter 메서드와 property 엘리먼트 name 속성의 관계
Setter 속성값 name은 speaker이 나오면 메서드= setSpeker이나와야함 (변수 이름 첫 글자를 대문자로 바꾸고 set을 붙임) -->
<!-- <constructor-arg value="2700000" /> -->
<!-- <constructor-arg index="1" value="2700000" /> -->
<!-- 생성자가 여러 개 오버로딩 되어있다면 어떤 생성자를 호출해야 할지 분명하지 않을때를 위해
index 속성을 이용하여 호출되는 생성자의 인자 순서를 명확하게 지정 가능합니다. -->
<!-- <property name="price" value="2700000" /> -->
<!-- </bean> -->
<!-- 생성자 인젝션과 마찬가지로 Setter 메서드를 호출하면서
다른 bean 객체를 인자로 넘길때는 ref 속성사용 기본형 데이터를 넘길떄는 value 속성사용 -->
<!-- 위의 생성자 요소 경로를 sony 로 해주었고 이 sony 가 아래 bean id ="sony"을 참조합니다. -->
<bean id="sony" class="polymorphism.SonySpeaker" />
<bean id="apple" class="polymorphism.AppleSpeaker" />
<!-- bean엘리먼트를 사용하는데 클래스 하나당 하나의 bean설정이 필요함 -->
<!-- <bean id="tv" class="polymorphism.SamsungTV" init-method="initMethod" /> -->
<!-- initMethod를 사용할려면 이 메소드에서 맴버변수에 대한 초기화 작업을 처리해야함 -->
<!-- <bean id="tv" class="polymorphism.SamsungTV" destroy-method="destroyMethod" /> -->
<!-- 객체 삭제하기 직전에 호출됨 -->
<!-- <bean id="tv" class="polymorphism.SamsungTV" lazy-init="true" /> -->
<!-- 클라이언트가 원할때 호출되어 메모리 관리를 효율적으로 할수 있습니다. -->
<!-- <bean id="tv" class="polymorphism.SamsungTV" scope="singleton" /> -->
<!-- Gof 디자인 패턴 중 하나인 singleton pattern scope속성을 이용함. 속성값은 singleton -->
<!-- <bean id="tv" class="polymorphism.SamsungTV" scope="property" /> -->
<!-- singleton와는 다르게 <bean>요청이 얼때마다 매번 새로운 객체를 사용함 -->
<!-- bean id="tv" class="polymorphism.LgTV" 동시 사용 불가 id 속성은 빈 객체를 요청할때 사용하므로
반드시 스프링 컨테이너가 생성한 객체들 사이 *유일*해야함 -->
<!-- <import resource="context-datasource.xml" /> <import resource="context-transaction.xml"
/> -->
</beans>
'개인공부' 카테고리의 다른 글
Maven (0) | 2022.08.26 |
---|---|
jdbc docker 연동오류.docker ip확인하기 (0) | 2022.08.08 |
Docker Tomcat mysql 환경 구성 (0) | 2022.08.08 |
트랜잭션(Transaction) (0) | 2022.08.02 |
getBean() 메서드 사용하기 (0) | 2022.07.29 |