본문 바로가기
개인공부

STS 예제 진행

by 요리하다그만둠 2022. 8. 4.

 

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