[환경 설정]
project선택 - 우클릭 -
Properties - Project Facets -
Dynamic Web Module 버전 3.1, Java 버전 11로 변경 -
우측 Runtimes 선택 - ApparcheTomcat 선택 - Apply
Spring 01 (결합도 높음)
LgTV.java
package polymorphism;
public class LgTV {
public void turnOn() {
System.out.println("엘지TV -- 전원을 켠다");
}
public void turnOff() {
System.out.println("엘지TV -- 전원을 끈다");
}
public void soundUp() {
System.out.println("엘지TV -- 소리를 높인다");
}
public void soundDown() {
System.out.println("엘지TV -- 소리를 낮춘다");
}
}
SamsungTV.java
package polymorphism;
public class SamsungTV {
public void powerOn() {
System.out.println("삼성TV -- 전원을 켠다");
}
public void powerOff() {
System.out.println("삼성TV -- 전원을 끈다");
}
public void volumeUp() {
System.out.println("삼성TV -- 볼륨을 올린다");
}
public void volumeDown() {
System.out.println("삼성TV -- 볼륨을 내린다");
}
}
TVUser.java
package polymorphism;
public class TVUser {
public static void main(String[] args) {
SamsungTV tv = new SamsungTV();
tv.powerOn();
tv.volumeUp();
tv.volumeDown();
tv.powerOff();
}
}
Spring 02 (bean factory 이용)
BeanFactory.java
package polymorphism;
public class BeanFactory {
public Object getBean(String beanName) {
if(beanName.equals("samsung")) {
return new SamsungTV();
}
else if(beanName.equals("lg")) {
return new LgTV();
}
return null;
}
}
LgTV.java
package polymorphism;
public class LgTV implements TV{
@Override
public void powerOn() {
System.out.println("엘지 TV -- 전원을 켠다");
}
@Override
public void powerOff() {
System.out.println("엘지 TV -- 전원을 끈다");
}
@Override
public void volumeUp() {
System.out.println("엘지 TV -- 볼륨을 올린다");
}
@Override
public void volumeDown() {
System.out.println("엘지 TV -- 볼륨을 내린다");
}
}
SamsungTV.java
package polymorphism;
public class SamsungTV implements TV{
//source - override/implements 선택
@Override
public void powerOn() {
System.out.println("삼성TV -- 전원을 켠다");
}
@Override
public void powerOff() {
System.out.println("삼성TV -- 전원을 끈다");
}
@Override
public void volumeUp() {
System.out.println("삼성TV -- 볼륨을 올린다");
}
@Override
public void volumeDown() {
System.out.println("삼성TV -- 볼륨을 내린다");
}
}
TV.java (interface)
package polymorphism;
public interface TV {
public void powerOn();
public void powerOff();
public void volumeUp();
public void volumeDown();
}
TVUser.java
package polymorphism;
public class TVUser {
public static void main(String[] args) {
BeanFactory factory = new BeanFactory();
TV tv = (TV)factory.getBean("samsung");
tv.powerOn();
tv.volumeUp();
tv.volumeDown();
tv.powerOff();
}
}
Spring 03 (applicationContext.xml 이용)
src/main/resource 선택 - 우클릭 - new - other
- SpringBeanConfigurationFile 선택 - applicationContext.xml 생성
Spring컨테이너
. BeanFactory
. ApplicationContext
- BeanFactory가 제공하는 <bean>객체를 생성하고, 관리하는 기본적인 컨테이너를 제공
- 그 외에도 트랜잭션 관리, 다국어 처리 등 다양한 지원을 함
ApplicationContext 구현하는 클래스
. GenericXmlApplicationContext : 파일시스템이나 클래스 경로에 있는 XML파일을 로딩해서 구동시키는 컨테이너
. xmlwebApplicationContext : 웹 어플리케이션 개발에 사용, 우리가 직접 생성하지 않는 컨테이너 (MVC)
beans 엘리먼트 속성들
. bean
- 스프링 설정파일에 클래스를 등록하는 엘리먼트
- 속성
id : 전체 스프링파일 안에서 유일해야 한다. 첫글자 특수문자/공백문자 사용불가
name : id와 동일하다. 첫글자 특수문자 사용가능
class : 패키지경로까지 포함
init-method
- web.xml에 등록된 서블릿은 객체를 생성할 때 기본생성자를 호출한다
초기화 시킬 수 없다. init()메서드로 초기화를 진행
- 스프링 컨테이너도 기본생성자를 호출해서 객체를 생성한다
같은 init-method속성을 지원한다 (init-method="메소드 이름")
destroy-method
: 객체를 삭제하기 직전에 호출된다.
lazy-init
- true : 시동시점에 객체를 생성하돌고 설정 (기본)
- false : 필요한 시점에 객체를 생성하도록 설정
scope
- 하나의 객체만 생성(싱글톤)여부 지정
- 디폴트 : 싱글톤
. import
: 하나의 xml에 모든 클래스를 모두 등록할수 있으나, beans에서 처리해야할 것이
bean등록관리, 트랜잭션관리, 예외처리, 다국어처리 등..다 하면 복잡하고 길어짐
context-datasource.xml context-transaction.xml
| |
<beans>
<import resource="context-datasource.xml">
<import resource="context-datasource.xml">
</beans>
. alias
. descripton
LgTV.java
package polymorphism;
public class LgTV implements TV{
@Override
public void powerOn() {
System.out.println("엘지TV -- 전원을 켠다");
}
@Override
public void powerOff() {
System.out.println("엘지TV -- 전원을 끈다");
}
@Override
public void volumeUp() {
System.out.println("엘지TV -- 볼륨을 올린다");
}
@Override
public void volumeDown() {
System.out.println("엘지TV -- 볼륨을 내린다");
}
}
SamsungTV.java
package polymorphism;
public class SamsungTV implements TV{
@Override
public void powerOn() {
System.out.println("삼성TV -- 전원을 켠다");
}
@Override
public void powerOff() {
System.out.println("삼성TV -- 전원을 끈다");
}
@Override
public void volumeUp() {
System.out.println("삼성TV -- 볼륨을 올린다");
}
@Override
public void volumeDown() {
System.out.println("삼성TV -- 볼륨을 내린다");
}
}
TV.java
package polymorphism;
public interface TV {
public void powerOn();
public void powerOff();
public void volumeUp();
public void volumeDown();
}
TVUser.java
package polymorphism;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVUser {
public static void main(String[] args) {
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
TV tv = (TV)factory.getBean("samsung");
tv.powerOn();
tv.volumeDown();
tv.volumeUp();
tv.powerOff();
}
}
applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="samsung" class="polymorphism.SamsungTV"></bean>
<bean id="Lg" class="polymorphism.LgTV"></bean>
</beans>
Spring 04 (Injection)
AppleSpeaker.java
package injection;
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--볼륨을 내린다");
}
}
LgTV.java
package injection;
public class LgTV implements TV{
private SonySpeaker speaker;
public void LgTV() {
System.out.println("===> SonySpeaker 객체생성 - 기본생성자");
}
//생성자를 활용한 의존객체 주입
public void LgTV(SonySpeaker speaker) {
System.out.println("===> SonySpeaker 객체생성 - 의존객체주입생성자");
this.speaker = speaker;
}
@Override
public void powerOn() {
System.out.println("엘지TV -- 전원을 켠다");
}
@Override
public void powerOff() {
System.out.println("엘지TV -- 전원을 끈다");
}
@Override
public void volumeUp() {
speaker.volumeUp();
}
@Override
public void volumeDown() {
speaker.volumeDown();
}
}
SamsungTV.java
package injection;
public class SamsungTV implements TV{
private SonySpeaker speaker;
private int price;
public void SamsungTV() {
System.out.println("===> SonySpeaker 객체생성 - 기본생성자");
}
//생성자를 활용한 의존객체 주입
public void SamsungTV(SonySpeaker speaker, int price) {
System.out.println("===> SonySpeaker 객체생성 - 의존객체주입생성자");
this.speaker = speaker;
this.price = price;
}
@Override
public void powerOn() {
System.out.println("삼성TV -- 전원을 켠다[가격: "+price+"원]");
}
@Override
public void powerOff() {
System.out.println("삼성TV -- 전원을 끈다");
}
@Override
public void volumeUp() {
speaker.volumeUp();
}
@Override
public void volumeDown() {
speaker.volumeDown();
}
}
SonySpeaker.java
package injection;
//의존객체
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 injection;
public interface Speaker {
public void volumeUp();
public void volumeDown();
}
TV.java (interface)
package injection;
public interface TV {
public void powerOn();
public void powerOff();
public void volumeUp();
public void volumeDown();
}
TVUser.java
package injection;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVUser {
public static void main(String[] args) {
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContent.xml");
TV tv = (TV)factory.getBean("tv");
tv.powerOn();
tv.powerOff();
tv.volumeUp();
tv.volumeDown();
}
}
applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="tv" class="injection.SamsungTV">
<constructor-arg index="0" ref="sony"></constructor-arg>
<constructor-arg index="1" value="5600000"></constructor-arg>
</bean>
<bean id="sony" class="injection.SonySpeaker" />
<bean id="apple" class="AppleSpeaker" />
</beans>
Spring 05 (setter 메소드활용)
AppleSpeaker.java
package Injection;
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--볼륨을 내린다");
}
}
LgTV.java
package Injection;
public class LgTV implements TV{
private Speaker speaker;
private int price;
public void LgTV() {
System.out.println("===> LgTV 객체생성 - 기본생성자");
}
//setter메소드 활용 의존객체 주입
public void setSpeaker(Speaker speaker) {
System.out.println("setSpeaker()호출");
this.speaker = speaker;
}
public void setPrice(int price) {
System.out.println("setPrice()호출");
this.price = price;
}
@Override
public void powerOn() {
System.out.println("엘지TV -- 전원을 켠다");
}
@Override
public void powerOff() {
System.out.println("엘지TV -- 전원을 끈다");
}
@Override
public void volumeUp() {
speaker.volumeUp();
}
@Override
public void volumeDown() {
speaker.volumeDown();
}
}
SamsungTV.java
package Injection;
public class SamsungTV implements TV{
private Speaker speaker;
private int price;
public void SamsungTV() {
System.out.println("===> SamsungTV 객체생성 - 기본생성자");
}
public void setSpeaker(Speaker speaker) {
System.out.println("===> setSpeaker() 호출");
this.speaker = speaker;
}
//setter메소드를 활용 의존객체주입
public void setPrice(int price) {
System.out.println("===> setPrice() 호출");
this.price=price;
}
@Override
public void powerOn() {
System.out.println("삼성TV -- 전원을 켠다[가격: "+price+"원]");
}
@Override
public void powerOff() {
System.out.println("삼성TV -- 전원을 끈다");
}
@Override
public void volumeUp() {
speaker.volumeUp();
}
@Override
public void volumeDown() {
speaker.volumeDown();
}
}
SonySpeaker.java
package Injection;
//의존객체
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 Injection;
public interface Speaker {
public void volumeUp();
public void volumeDown();
}
TV.java (interface)
package Injection;
public interface TV {
public void powerOn();
public void powerOff();
public void volumeUp();
public void volumeDown();
}
TVUser.java
package Injection;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVUser {
public static void main(String[] args) {
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContent.xml");
TV tv = (TV)factory.getBean("tv");
tv.powerOn();
tv.powerOff();
tv.volumeUp();
tv.volumeDown();
}
}