package com.test.spr;
public interface Record
{
public void setKor(int kor);
public int getKor();
public void setEng(int eng);
public int getEng();
public void setMat(int mat);
public int getMat();
public double getAvg();
public int getTot();
}
위와 같이 정의되어 있지 않은 interface 선언 이후 이를 implement 하는 클래스들은 모두 의존객체로써 작동할 수 있다. 또한 객체를 사용해야하는 위치에 의존관계를 만들 수 있다.
package com.test.spr;
public class RecordImpl1 implements Record
{
//주요속성 구성
private int kor, eng, mat;
@Override
public void setKor(int kor)
{
this.kor = kor;
}
@Override
public int getKor()
{
return kor;
}
@Override
public void setEng(int eng)
{
this.eng = eng;
}
@Override
public int getEng()
{
return eng;
}
@Override
public void setMat(int mat)
{
this.mat = mat;
}
@Override
public int getMat()
{
return mat;
}
@Override
public double getAvg()
{
double result = 0;
result = this.getTot()/3.0;
return result;
}
@Override
public int getTot()
{
int result = 0;
result = this.getKor() + this.getEng() + this.getMat();
return result;
}
1번에서 만든 interface를 implement하는 클래스를 생성하고 Override한다.
이 과정은 이후 Record로 업캐스팅 될수있게 만들고 업캐스팅 될 수 있다는것은
의존객체로 작동할수 있다는것
package com.test.spr;
public interface RecordView
{
//setter 메소드 선언 -> Record 인터페이스 타입의 객체를 넘겨받을 수 있도록 처리
public void setRecord(Record record);
public void input();
public void output();
}
의존관계: RecordView형 객체가 Record형 객체에 의존하게된다.
즉, Ioc가 성립되고 DI를 진행한것
/*=========================================
RecordViewImp1.java
-클래스
-RecordView 인터페이스를 구현하는 클래스로 설계
====================================*/
package com.test.spr;
import java.util.Scanner;
public class RecordViewImpl1 implements RecordView
{
//속성 구성 -> 인터페이스 형태의 자료형 구성
private Record record;
@Override
public void setRecord(Record record)
{
// TODO Auto-generated method stub
this.record = record;
}
@Override
public void input()
{
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("국어 영어 수학 점수 입력(공백 구분) : ");
String kor = sc.next();
String eng = sc.next();
String mat = sc.next();
record.setKor(Integer.parseInt(kor));
record.setEng(Integer.parseInt(eng));
record.setMat(Integer.parseInt(mat));
sc.close();
}
@Override
public void output()
{
System.out.println("국어 영어 수학 총점 평균");
System.out.printf("%6d %4d %4d %6d %5.1f"
, record.getKor(), record.getEng(), record.getMat()
, record.getTot(), record.getAvg());
}
}
<?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-3.0.xsd">
<!-- ※ 스프링이 제공하는 환경 설정 XML 파일 샘플 -->
<!-- → 스프링이 생성하고 관리해야 할 객체들에 대한 정보 전달 -->
<!--
내가 여기에 스프링 컨테이너가 운용하는데 필요할 목록 적어둘게
너가 운용해야 할, 운용하는 과정에서 필요한 설명서
내가 여기에 다 기술해둘테니까 너가 필요하다고 판단하면 그거 쓰면 돼
-->
<!--
우리 xml에 다 bean 으로 등록해놨다.
springContainer 안에서는 bean Container 가 돌아간다.
bean 공장이 생겨서 bean을 생성해낸다.
enterprise 기반으로 생성한거라, 단일 bean에 집중해서 돌아가는게 아니라
여러 bean들을 찍어내고, 관리하는 게 비일비재하게 일어나기 때문에
bean 생성하는 factory들(→ bean factory)이 있는
공단(→ applicationContext) 자체가 돌아가게 된다.
'bean 식별해줬으면 좋겠어'하고 id 설정해서 라벨링을 다 한 것이다.
-->
<!-- id는 이름 뭐라고 부를지 정해서 쓰고, 클래스는 우리가 만든거 쓰면 된다. -->
<!--
필요하면 너가 알아서 인스턴스 생성해
그리고 너가 필요한만큼 쓰고, 너가 알아서 소멸시키면 돼
얼마만큼 살려둘지 라이프사이클 관리도 너가 해
-->
<!-- RecordImpl1 (Record) 클래스에 대한 객체 정보 전달 과정 -->
<bean id="record1" class="com.test.spr.RecordImpl1"></bean>
<!-- 『com.test.spr.RecordImpl1 record1 = new com.test.spr.RecordImpl1();』 -->
<!-- 구문을 수행할 수 있도록 관련 정보를 스프링 컨테이너에 전달 -->
<!-- RecordImpl2 (Record) 클래스에 대한 객체 정보 전달 과정 -->
<bean id="record2" class="com.test.spr.RecordImpl2"></bean>
<!-- RecordViewImpl (RecordView) 클래스에 대한 객체 정보 전달 과정 -->
<!--
그런데, RecordViewImpl 은 Record 인터페이스 타입의 객체를 필요로 한다.
RecordViewImpl 의 의존객체는 Record 이다.
여기서 DI 설정도 해주게 된다고 했으므로, 의존객체에 대한 정보 전달
property 태그 사용해서
-->
<bean id="view" class="com.test.spr.RecordViewImpl">
<!-- RecordImpl1 또는 RecordImpl2 객체 (→ 의존 객체)에 대한 DI 설정 정보 전달 과정 -->
<!-- 『property』 엘리먼트는 setter 메소드에 대한 구성 -->
<!-- 즉, 『setXxx()』 메소드인 경우
『<property name="xxx"></property>』 -->
<property name="record">
<!-- RecordViewImpl의 setter 메소드에 Record record 라고 매개변수 받으니 -->
<!-- 그 이름 property name에 넣어준거!! -->
<!-- 『ref』 엘리먼트는 DI 객체에 대한 참조 지정 -->
<!-- <ref bean="record1"/> -->
<ref bean="record2"/>
</property>
<!-- ※ 위 구문은 (Line 44~50) -->
<!-- 『<property name="record" ref="record1"></property>』 -->
<!-- 형태로 작성해도 된다. -->
<!-- → 참조는 별도로 등록안하고, 속성값으로 넘겨줘도 상관없다는 얘기이다. -->
</bean>
</beans>
위와 같이 XML을 통해 생성해야할 객체와 객체에서 사용해야할 객체에 대한 정보를 지정해줄 수 있다.
/*=====================================
Main.java
-클래스
-main() 메소드가 포함된 테스트 클래스
======================================= */
package com.test.spr;
public class Main
{
public static void main(String[] args)
{
//※ 스프링 프레임워크에서는
// 객체 생성 과정 및 DI(의존 객체 주입)에 대한 설정은
// 스프링 환경 설정 파일로 대체된다.
//스프링 프레임워크에서 『applicationContext.xml』 파일을 읽어서
// 생성 및 관리할 객체에 대한 정보를 얻어낼 수 있도록 처리해 주는 과정이 필요하다.
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//context로 부터 『getBean()』메소드를 이요하여
//사용자가 원하는 객체를 얻어와서 사용할 수 있다.
// 이 과정에서 메소드 인자값으로는 id속성을 지정하면 된다.
//RecordView view = (RecordViewImpl1)context.getBean("view");
RecordView view = context.getBean("view", RecordViewImpl1.class);
//위 둘은 같은 구문이다.
//단 55번 line은 스프링 3.0이후 버전부터
// 아래 코드 형식으로 사용하는 것이 가능.
view.input();
view.output();
}
}
XML에서 설정해놓은 생성규칙에 따라 객체가 생성되고 이를 사용할 수 있게된다.