인자값이 둘 일 때

첫인자값 브랜드명, 두번째 인자값 가격

package kh.spring.beans;

import kh.spring.interfaces.Speaker;
import kh.spring.interfaces.Tv;

public class LgTV  implements Tv{

	private Speaker speaker;
	private int price;

	public LgTV(Speaker speaker, int price) {
		System.out.println("LG TV 생성!");
		this.speaker = speaker;
		this.price = price;
	}

	public void powerOn() {
		System.out.println("TV 켜짐!");

	}

	public void powerOff() {
		System.out.println("TV 꺼짐");

	}

	public void init() {
		System.out.println("LG TV 초기 설정 가동");

	}

	public void destroy() {
		System.out.println("LG TV 고장났음.");

	}
	@Override
	public void pricePrint() {
		System.out.println("LG TV : "+this.price);		
	}

}
package kh.spring.main;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

import kh.spring.interfaces.Tv;

public class Main {

	public static void main (String[] args) {
		AbstractApplicationContext ctx = new GenericXmlApplicationContext("context.xml");
		
		Tv tv1 = (Tv)ctx.getBean("tv"); // Dependency Lookup : DL / DI

		
		ctx.close();
		
	}
}

 컨테이너 인스턴스 본인 영역 확보

생성자에 Sony 필요

소니가 ref되어 들어감 (의존성 주입)

빈 태그에 있는 브릿츠 소니 둘다 생성됨

설정파일을 통해서 교체할 수 있도록 준비


LgTV

package kh.spring.beans;

import kh.spring.interfaces.Speaker;
import kh.spring.interfaces.Tv;

public class LgTV  implements Tv{

	private Speaker speaker;
	private int price;

	public Speaker getSpeaker() {
		return speaker;
	}

	public void setSpeaker(Speaker speaker) {
		this.speaker = speaker;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public LgTV(Speaker speaker, int price) {
		System.out.println("LG TV 생성!");
		this.speaker = speaker;
		this.price = price;
	}

	public void powerOn() {
		System.out.println("TV 켜짐!");

	}

	public void powerOff() {
		System.out.println("TV 꺼짐");

	}

	public void init() {
		System.out.println("LG TV 초기 설정 가동");

	}

	public void destroy() {
		System.out.println("LG TV 고장났음.");

	}
	@Override
	public void pricePrint() {
		System.out.println("LG TV : "+this.price);		
	}

}

 

Setter Injection

constructor 대신에 setter로 값 넣기

<property>

<?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">


	<!-- init-method="init" destroy-method="destroy" lazy-init="true" -->
	<bean id="tv" class="kh.spring.beans.LgTV">
		<property name="speaker" ref="Britz"/>
		<property name="price" value="5000"/>
	</bean>

	<bean id="Britz" class="kh.spring.beans.BritzSpeaker">
	</bean>
	<bean id="Sony" class="kh.spring.beans.SonySpeaker">
	</bean>


	<!-- IOC : ( Inversion of Control : 제어의 역전 ) -->
	<!-- DI : ( Dependency Injection : 의존성 주입 ) -->

</beans>

 

 


		<property name="speaker" ref="Britz"/>
		<property name="price" value="5000"/>

bean은 ref

기본자료형은 value

list나 map을 넣는 경우?

 


XML과 다른 형태의 문법

Annotation

<!--  XML 방식 -->
	<bean id="tv" class="kh.spring.beans.LgTV">
		<property name="speaker" ref="Britz"/>
		<property name="price" value="5000"/>
	</bean>

	<bean id="Britz" class="kh.spring.beans.BritzSpeaker">
	</bean>
	<bean id="Sony" class="kh.spring.beans.SonySpeaker">
	</bean>

두 방식은 서로 완전히 대체할 수 없음 : 혼용해야 함

 


@Component

package kh.spring.beans;

import org.springframework.stereotype.Component;

import kh.spring.interfaces.Speaker;
import kh.spring.interfaces.Tv;


@Component
public class LgTV  implements Tv{


	private Speaker speaker;
	private int price;

	public LgTV() {}
	
	public Speaker getSpeaker() {
		return speaker;
	}

	public void setSpeaker(Speaker speaker) {
		this.speaker = speaker;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public LgTV(Speaker speaker, int price) {
		System.out.println("LG TV 생성!");
		this.speaker = speaker;
		this.price = price;
	}

	public void powerOn() {
		System.out.println("TV 켜짐!");

	}

	public void powerOff() {
		System.out.println("TV 꺼짐");

	}

	public void init() {
		System.out.println("LG TV 초기 설정 가동");

	}

	public void destroy() {
		System.out.println("LG TV 고장났음.");

	}
	@Override
	public void pricePrint() {
		System.out.println("LG TV : "+this.price);		
	}

}
package kh.spring.beans;

import org.springframework.stereotype.Component;

import kh.spring.interfaces.Speaker;

@Component
public class BritzSpeaker implements Speaker{

	public BritzSpeaker() {
		System.out.println("Britz Speaker 생성 ");
	}

}

 

 

<context:component-scan base-package="패키지 경로" />

 

컴퍼넌트 어노테이션 ( @Component )이 붙은 클래스들을 찾아서 인스턴스로 만들어서 메모리에 적재.

<?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-4.3.xsd">

	<!-- Annotation -->
	<context:component-scan base-package="kh.spring" />

</beans>

<bean>을 쓰지 않아도 인스턴스 생성!

 

의존성 주입은 되지 않음

@Autowired : 자동으로 연결


소니스피커에도 어노테이션을 하면?

엘지티비가 가진 스피커는 1개 , 스피커를 상속받는 클래스는 2개(브릿츠 소니)

에러 : 하나만 찾아지길 기대했는데 2개를 찾았다

 

> 프로젝트 규모가 클때는 큰 제약사항이 된다.

 

2개의 인스턴스에 각각 이름값을 붙여주고 오토와이어드 할때 이름을 명시해 줘야 함

 

-> 흔하지 않은 상황

 

사용할 때마다 소스코드 안에 명시된 코드 변경해야 함 : new , 팩토리패턴에 비해 나은 것이 없음


어노에티션이 상대적으로 사용하기 편하지만 단점으로는 극복할수 없는 상황 발생

1. 결국 이름을 명시해야하는 상황 (컴퍼넌트를 여러개 찾거나 0개 찾는 경우)

2. 우리가 만든 클래스라면 @Component를 붙일 수 있음, 만약 이미 존재하는 클래스/외부라이브러리(Scanner, ....)라면?

 

따라서 XML과 혼용하여 사용한다.

( XML만으로 코드를 짜는 회사도 존재 )


Spring_01.zip
0.03MB

'디지털 컨버전스 > Spring' 카테고리의 다른 글

[Spring Framework]  (0) 2020.05.29
[Spring Framework] 서버 연결  (0) 2020.05.27
[Spring Framework] Spring MVC  (0) 2020.05.27
[Spring Framework] 설정, DL / DI , IOC  (0) 2020.05.27
[Spring Framework] 설치  (0) 2020.05.26

+ Recent posts