인자값이 둘 일 때
첫인자값 브랜드명, 두번째 인자값 가격
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' 카테고리의 다른 글
[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 |