Bean Constructor/Property 복습
Class - Bean 등록 방식 예제
1) XML
2) Annotation
Constructor Injection :
Setter Injection:
Speaker 추상메소드
package polymorphism;
public interface iSpeaker05 {
// 추상메소드 선언
// 상속관계 만들면 xml로 가져오기 편함
void VolumeUp() ;
void VolumeDown() ;
}
nb, pd, enc speaker의 구성은 아래와 동일(iSpeaker 상속)
package polymorphism;
public class nbSpeaker05 implements iSpeaker05{
public nbSpeaker05() {
System.out.println("==> nbSpeaker() 시작");
}
public void VolumeUp() {
System.out.println("nb Speaker 볼륨 올림");
}
public void VolumeDown() {
System.out.println("nb Speaker 볼륨 내림");
}
}
ssTV 생성자에서 Speaker 객체 생성
package polymorphism;
public class ssTV05 implements iTV{
private iSpeaker05 speaker;
ssTV05() { System.out.println("ssTV 호출"); }
public ssTV05(iSpeaker05 speaker){
super();
System.out.println("ssTV05 호출");
this.speaker = speaker;
}
public void PowerOn() {
System.out.println("SS TV05 전원 켜짐");
}
public void PowerOff() {
System.out.println("SS TV05 전원 꺼짐");
}
public void VolumeUp() {
//System.out.println("SS TV 볼륨 높임");
// 이미 xml에서 생성돼서 들어오므로 필요 x => 생성자 없앰
//speaker = new pdSpeaker05();
speaker.VolumeUp();
}
public void VolumeDown() {
//System.out.println("SS TV 볼륨 낮춤");
//speaker = new pdSpeaker05();
speaker.VolumeDown();
}
}
main
package polymorphism;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVTest05 {
public static void main(String[] args) {
// 1. Spring 컨테이너를 구동한다. factory가 container
AbstractApplicationContext factory
= new GenericXmlApplicationContext("applicationContext05.xml");
// 2. Spring 컨테이너로부터 필요한 객체를 요청(Lookup)
// == dependency lookup
iTV tv = (iTV) factory.getBean("tv");
tv.PowerOn();
tv.VolumeUp();
tv.VolumeDown();
tv.PowerOff();
// 3. Spring 컨테이너를 종료한다.
factory.close();
}
}
applicationContext.xml
따라서, ssTV05는 pdSpeaker05 클래스에 의존성을 가짐
<?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="nb" class="polymorphism.nbSpeaker05" />
<!-- constructor injection (생성자에 전달) -->
<bean id="tv" class="polymorphism.ssTV05" >
<constructor-arg ref="nb"></constructor-arg>
</bean>
</beans>
실행 결과
==> nbSpeaker() 시작
ssTV05 호출
SS TV05 전원 켜짐
nb Speaker 볼륨 올림
nb Speaker 볼륨 내림
SS TV05 전원 꺼짐
package polymorphism;
public class ssTV06 implements iTV{
private iSpeaker05 speaker;
ssTV06() { System.out.println("ssTV06 호출"); }
public void setSpeaker(iSpeaker05 speaker){
System.out.println("setSpeaker 호출");
this.speaker = speaker;
}
public void PowerOn() {
System.out.println("SS TV06 전원 켜짐");
}
...
}
applicationContext.xml
코드 예제)
- speaker라는 이름은 ssTV06에서 선언된 변수
- property name : setter메소드 이름의 name부분 (setSpeaker -> speaker)
- property value : 변수에 맞는 값을 value를 사용해 할당
- property ref : 객체를 주입시 사용
<?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">
<!-- setter method injection (참조 전달 = ref)-->
<bean id="tv" class="polymorphism.ssTV06" >
<property name="speaker" ref = "pd"></property>
</bean>
<bean id="pd" class="polymorphism.pdSpeaker05" />
<bean id="enc" class="polymorphism.encSpeaker05" />
<bean id="nb" class="polymorphism.nbSpeaker05" />
</beans>
실행 결과
ssTV06 호출
==> pdSpeaker() 시작
setSpeaker 호출
==> encSpeaker05() 시작
==> nbSpeaker() 시작
SS TV06 전원 켜짐
pd Speaker 볼륨 올림
pd Speaker 볼륨 내림
SS TV06 전원 꺼짐
<bean id="bk01" class="polymorphism.Book07" />
<!-- 기본타입을 값으로 전달해야 함 (값 전달 = value )-->
<bean id="bk02" class="polymorphism.Book07" >
<constructor-arg index="0" value = "Java"></constructor-arg>
<constructor-arg index="1" value = "hong-gil-dong"></constructor-arg>
<constructor-arg index="2" value = "31000"></constructor-arg>
</bean>
<!-- setter가 있어야 작동 -->
<bean id = "bk03" class="polymorphism.Book07">
<property name="title" value = "스프링"></property>
<property name="author" value = "계절"></property>
<property name="price" value = "365000"></property>
</bean>
public class Book07 {
String title = "무 제";
String author = "무 명";
int price = 100;
Book07(){
System.out.println("==> Book06 기본 생성자");
}
Book07(String t, String a, int p){
this.title = t;
this.author = a;
this.price = p;
System.out.println("==> Book06(t,a,p) 생성자");
}
public void setPrice(int price) {
this.price = price;
}
...
<bean id="tv1" class="polymorphism.ssTV08">
<constructor-arg index="0" ref = "pd"></constructor-arg> <!-- 참조형 -->
<constructor-arg index="1" value = "127000"></constructor-arg> <!-- 값 형 -->
</bean>
<!-- 파라미터 주기 -->
<!-- tv02.setPrice("24000"); 와 동일 -->
<bean id="tv2"
class="polymorphism.ssTV08"
p:speaker-ref="nb"
p:price="24000"/>
<bean id="pd" class="polymorphism.pdSpeaker05" />
<bean id="nb" class="polymorphism.pdSpeaker05" />
public class ssTV08 implements iTV{
private iSpeaker05 speaker;
private int price;
ssTV08() { System.out.println("ssTV08() 호출"); }
public ssTV08(iSpeaker05 speaker){
super();
System.out.println("ssTV08(speaker) 호출");
this.speaker = speaker;
}
// 참조형과 값 형 동시에 생성
public ssTV08(iSpeaker05 speaker, int price){
super();
System.out.println("ssTV08(speaker) 호출");
this.speaker = speaker;
this.price = price;
}
...
@Component : 작성한 Class Bean을 등록
@Bean : 외부 라이브러리를 bean으로 생성
@Autowired : filed, setter method, constructor에서 사용
Type에 따라서 Bean을 주입
@Inject : Autowired와 비슷한 역할
@Controller : Spring의 Controller
예제 1) ssTV09.java
// 컨테이너에 이름 등록
@Component("tv1")
public class ssTV09 implements iTV{
//speaker로 container에 등록해달라 요청 => DI
//@Autowired // 생성자, 메소드, 멤버변수로 하나씩 주입할 때 씀=> 여러개의 speaker가 존재할 때 사용 불가 (변수 하나 등록)
//@Resource(name="pd") // 여러개의 speaker가 존재할 때, 사용할 speaker를 지정해주면 사용 가능 (호출) = autowired+qualifier
// 이 두개를 합친 것 == Resource
// @Autowired
// @Qualifier("nb") // 두 개 이상일 때 직접 호출
@Resource(name="nb")
private iSpeaker05 speaker;
private int price;
ssTV09() { System.out.println("ssTV09() 호출"); }
public ssTV09(iSpeaker05 speaker){
super();
System.out.println("ssTV08(speaker) 호출");
this.speaker = speaker;
}
...
예제 1) nbSpeaker09.java
package polymorphism;
import org.springframework.stereotype.Component;
//컨테이너에 이름 등록
@Component("nb")
public class nbSpeaker09 implements iSpeaker05{
public nbSpeaker09() {
System.out.println("==> nbSpeaker09() 시작");
}
public void VolumeUp() {
System.out.println("nb Speaker 볼륨 올림");
}
public void VolumeDown() {
System.out.println("nb Speaker 볼륨 내림");
}
}
예제 1) application09.xml
<!-- 패키지 안의 내용을 자동으로 인식 -->
<!-- 변수를 줄 수있는 부분이 없음 so, annotation에 변수 명 줌 -->
<context:component-scan base-package="polymorphism"></context:component-scan>