setting.xml을 통해 Dependency Injection에 대한 내용들을 담았기에 이를 활용할 수 있도록 코드에 반영해야 한다. 이 때 사용되는 것이 Application Context 클래스이며 IoC Container의 실체라고 볼 수 있다. Application Context는 4가지 종류로 구현이 되며 그 중 가장 많이 사용되는 ClassPathXmlApplicationContext는 루트경로로부터의 상대경로를 기입해 xml이 어디에 있는지 알려준다.
위의 내용을 코드로 작성하면 오류가 발생하는데 이는 스프링 라이브러리를 추가하지 않았기 때문이다. 여기서는 자바 프로젝트를 메이븐 프로젝트로 변환하여 Dependency를 추가한다.
위와 같이 손쉽게 메이븐 프로젝트로 변경하고 다음과 같이 생성된 pom.xml에 Dependency를 입력해준다.
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
이후 Program 파일에서 ApplicatoinContext를 임포트하여 사용할 수 있다. 이제 여기에 담긴 것들을 사용할 수 있는데 2가지 방법이 있다.
id로 가져올 경우 객체로 반환되기에 이를 캐스팅하는 작업이 필요하며 class로 가져올 때에는 해당 클래스로 가져오록 지정하기에 더 선호되는 방법이다.
package spring.di;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.di.ui.ExamConsole;
public class Program {
public static void main(String[] args) {
/* 스프링에 지시하는 방법으로 변경
Exam exam = new NewlecExam();
ExamConsole console = new GridExamConsole();
console.setExam(exam);
*/
ApplicationContext context =
new ClassPathXmlApplicationContext("spring/di/setting.xml");
ExamConsole console = (ExamConsole) context.getBean("console");
// ExamConsole console = context.getBean(ExamConsole.class);
console.print();
}
}
이후 setting.xml에서 GridExamConsole을 InlineExamConsole로 바꿔도 정상적으로 동작한다