1. Application Context
- ClassPathXmlApplicationContext : 프로젝트 폴더 루트 주소에 있는 xml 파일 사용
- FileSystemXmlApplicationContext : C 혹은 D 드라이브 등 파일 시스템에 있는 xml 경로 입력 후 사용
- XmlWebApplicationContext : 웹에 둔 xml을 사용
- AnnotationConfigApplicationContxt : xml을 사용하지 않고 어노테이션을 이용하여 환경설정을 함
2. Application Context 사용을 위한 메이븐을 통한 Spring context 추가
https://mvnrepository.com/search?q=spring+context
버전 선택 후 위의 코드를 pom.xml 파일에 긁어붙힌다.
3. context를 통한 DI 예제
1) setting.xml
<?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"
xmlns:p="http://www.springframework.org/schema/p">
<!-- Exam exam=new NewlecExam(); 아래는 객체를 생성한 것-->
<bean id="exam" class="spring.di.entity.NewlecExam"/>
<!-- ExamConsole console = new GridExamConsole(exam); -->
<bean id="console" class="spring.di.ui.InlineExamConsole">
<!-- console.setExam(exam); 아래는 Injection을 한 것임-->
<property name="exam" ref="exam"/>
</bean>
</beans>
2) 실행코드
public class Program {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml");
Exam exam= context.getBean(Exam.class);
System.out.println(exam.toString());
ExamConsole console = (ExamConsole) context.getBean("console"); //방법1
//ExamConsole console = context.getBean(ExamConsole.class); //방법2
console.print();
}
}
4. xml에서 객체 생성 및 해당 객체의 필드값 초기화
public class NewlecExam implements Exam{
private int kor;
private int eng;
private int math;
private int com;
...
}
위와 같이 NewlecExam에 필드가 존재할 때 아래와 같이 xml에서 값을 설정해줄 수 있다.
<bean id="exam" class="spring.di.entity.NewlecExam">
<property name="kor">
<value>10</value>
</property>
<property name="eng" value="10"/>
<property name="math" value="10"/>
<property name="com" value="10"/>
</bean>
5. 생성자 DI
public class NewlecExam implements Exam{
private int kor;
private int eng;
private int math;
private int com;
public NewlecExam() {
}
public NewlecExam(int kor, int eng, int math, int com) {
this.kor = kor;
this.eng = eng;
this.math = math;
this.com = com;
}
...
}
매개변수를 넣을 수 있는 생성자를 만들어 준 뒤, 아래와 같이 값을 주입시킬 수 있다.
만약 name이나 index를 사용하지 않으면 매개변수 순서대로 값이 주입된다.
<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10">
<!-- 매개 변수가 있는 생성자에 순서대로 값을 넣음, index 사용하면 순서 설정 가능 또는 name -->
<constructor-arg name="kor" value="10"/>
<constructor-arg index="1" value="20"/>
<constructor-arg index="3" value="30"/>
<constructor-arg index="2" value="40"/>
</bean>
만약 타입을 float으로 지정해주고 싶다면, 그에 대응되는 생성자를 만들고 xml 파일에서는
<constructor-arg name="kor" type="float" value="10"/>
<constructor-arg index="1" type="float" value="20"/>
<constructor-arg index="3" type="float" value="30"/>
<constructor-arg index="2" type="float" value="40"/>
와 같이 수정해준다.
6. p 네임스페이스 사용으로 필드값 설정
xmlns:p="http://www.springframework.org/schema/p
p 네임스페이스를 사용하기 위해서는 위 구문이 xml에 포함되어야 한다.
사용방법은 아래와 같다.
<?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"
xmlns:p="http://www.springframework.org/schema/p">
<!-- Exam exam=new NewlecExam(); 아래는 객체를 생성한 것-->
<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10">
</bean>
<!-- ExamConsole console = new GridExamConsole(exam); -->
<bean id="console" class="spring.di.ui.InlineExamConsole">
<!-- console.setExam(exam); 아래는 Injection을 한 것임-->
<property name="exam" ref="exam"/>
</bean>
</beans>
7. 콜렉션 생성과 목록 DI
List<Exam> exams=new ArrayList<>();
exams.add(new NewlecExam(1,1,1,1));
for(Exam e:exams)
System.out.println(e);
라는 코드를 xml의 빈 객체를 통해 생성해보고자 한다.
1) 생성자를 통해 Collection에 객체를 추가하는 방법
List<Exam> exams = (List<Exam>) context.getBean("exams");
for(Exam e:exams)
System.out.println(e);
<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10"/>
<bean id="exams" class="java.util.ArrayList">
<constructor-arg>
<list>
<bean class="spring.di.entity.NewlecExam" p:kor="20" p:eng="30"/>
<ref bean="exam"/>
</list>
</constructor-arg>
</bean>
2) util 네임스페이스를 이용하여 Collection에 객체를 추가하는 방법
먼저 util 네임스페이스를 xml에 추가한다.
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.2.xsd"
xmlns:util="http://www.springframework.org/schema/util"
<util:list id="exams" list-class="java.util.ArrayList">
<bean class="spring.di.entity.NewlecExam" p:kor="1" p:eng="3"/>
<ref bean="exam"/>
</util:list>
설정파일인 xml에 위와 같은 내용을 추가하고 아래 코드를 실행시키면
List<Exam> exams = (List<Exam>) context.getBean("exams");
for(Exam e:exams)
System.out.println(e);
위와같은 출력을 확인할 수 있다.