[ 이전 글 ]
Inversion of Control Container ( Ioc Container )
Inversion of Control Container ( Ioc Container )
( 이전 글과 이어지는 내용입니다. https://cloakinghost.tistory.com/8 ) 작성한 XML 파일을 읽어오는 코드를 작성해보자 메인함수에 작성한 부분을 바꿀것이다 Exam exam = new ScoreExam(); ExamConsole console = new Gri
cloakinghost.tistory.com
Java코드를 XML로 바꿀 수 있다.
객체 초기화
작성방법
충돌방지를 위해 패키지명을 기제한다
id="변수명" class="사용할 클래스의 위치"
id="temp" class="패키지.패키지.패키지.클래스이름"
1. setter 사용
// spring.di.entity.Exam exam = new spring.di.entity.ScoreExam();
Exam exam = new ScoreExam();
exam.setKor(10);
exam.setEng(20);
exam.setMath(30);
exam.setCom(40);
field별로 setter 없으면 BeanCreationException 발생
<bean id="exam" class="spring.di.entity.ScoreExam">
<property name="kor">
<value>10</value>
</property>
<property name="eng" value="20" />
<property name="math">
<value>30</value>
</property>
<property name="com" value="40"/>
<bean>
2. 생성자(constrctor) 사용
ScoreExam exam = new ScoreExam(10, 20, 30, 40);
생성자 오버로딩 안되어 있으면 BeanCreationException 발생
<bean id="exam" class="spring.di.entity.ScoreExam">
<constructor-arg name="kor" value="10"/>
<constructor-arg name="eng" value="20"/>
<constructor-arg name="math" value="30"/>
<constructor-arg name="com" value="40"/>
</bean>
3. Namespace 중 p 처리기 사용
<bean id="exam" class="spring.di.entity.ScoreExam" p:kor="10" p:eng="20"/>
4. 객체( 인스턴스 ) 를 인자로 사용하는 경우
// exam 객체는 위에서 만든 것
// 1.
ExamConsole console = new GridExamConsole();
console.setExam(exam);
// 2.
// ExamConsole console = new GridExamConsole(exam);
생성자 오버로딩 안되어 있으면 BeanCreationException 발생
<bean id="console" class="spring.di.ui.GridExamConsole">
<property name="exam" ref="exam" />
</bean>
<!-- id 중복 안됨 -->
<!-- <bean id="console" class="spring.di.ui.GridExamConsole">
<constructor-arg name="exam" ref="exam"/>
</bean> -->
ArrayList 초기화
List<Exam> exams = new ArrayList<>();
exams.add(new ScoreExam(1, 2, 3, 4));
exams.add(exam);
// new ArrayList();// 생성자 인자로 Collection을 넣을 수 있다 이를 활용해 XML에서 추가하자
// setter가 없기때문에 이를 사용한다
1. 생성자(constrctor) 사용
<!-- exam은 위에서 만들었음 -->
<bean id="exams" class="java.util.ArrayList">
<constructor-arg>
<list>
<bean class="spring.di.entity.ScoreExam" p:kor="40" p:eng="20"/>
<ref bean="exam"/>
</list>
</constructor-arg>
</bean>
2. Namespace 중 util 처리기 사용
<util:list id="exams" list-class="java.util.ArrayList">
<bean class="spring.di.entity.ScoreExam" p:kor="40" p:eng="20" />
<ref bean="exam" />
</util:list>
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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
<!-- Exam exam = new ScoreExam(); exam.setKor(10); 과 같음 -->
<!-- 충돌방지를 위해 패키지명을 기제한다 id="변수명" class="사용할 클래스의 위치" -->
<!-- <bean id="exam" class="spring.di.entity.ScoreExam"> -->
<!-- 1. setter를 사용한 초기화 field별로 setter 없으면 에러 -->
<!-- <property name="kor">BeanCreationException setter 없으면 발생하는 에러
<value>10</value>
</property>
<property name="eng" value="20" />
<property name="math">
<value>30</value>
</property>
<property name="com" value="40"/> -->
<!-- 2. ScoreExam exam = new ScoreExam(10, 20, 30, 40);과 같음 -->
<!-- <constructor-arg name="kor" value="10"/>
<constructor-arg name="eng" value="20"/>
<constructor-arg name="math" value="30"/>
<constructor-arg name="com" value="40"/>
</bean> -->
<!-- 3. p 처리기 추가 -->
<bean id="exam" class="spring.di.entity.ScoreExam" p:kor="10" p:eng="20"/>
<!-- ExamConsole console = new GridExamConsole(); console.setExam(exam); 과 같음 -->
<!-- <property name="setter가 사용되고 있는 필드명" value="기본타입인 경우" ref="인스턴스인 경우"/> -->
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- 객체 주입 시 ref를 사용하는 2가지 방법 -->
<!-- console.setExam(exam); 와 같음 -->
<!-- <property name="exam" ref="exam" /> -->
<property name="exam">
<ref bean="exam" />
</property>
</bean>
<!-- 이것도 됨 -->
<!-- id는 중복이 안된다 -->
<!-- <bean id="console" class="spring.di.ui.GridExamConsole">
<constructor-arg name="exam" ref="exam"/>
</bean> -->
<!-- 1. 생성자를 사용하여 초기화 -->
<!-- <bean id="exams" class="java.util.ArrayList">
<constructor-arg>
<list>
<bean class="spring.di.entity.ScoreExam" p:kor="40" p:eng="20"/>
<ref bean="exam"/>
</list>
</constructor-arg>
</bean> -->
<!-- 2. util 처리기 사용 -->
<util:list id="exams" list-class="java.util.ArrayList">
<bean class="spring.di.entity.ScoreExam" p:kor="40" p:eng="20" />
<ref bean="exam" />
</util:list>
</beans>
실행부(main())
생성자 오버로딩, 클래스 내용은 생략
package spring.di;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.di.entity.Exam;
import spring.di.ui.ExamConsole;
public class Main {
public static void main(String[] args) {
// 1. Data Entity Class, 2. Display Class
// 1. 순수 Java
// Exam exam = new ScoreExam();
// ExamConsole console = new InlineExamConsole(); // DI
// ExamConsole console = new GridExamConsole(); // DI
// console.setExam(exam);
// 이 코드를 필요한 경우 계속 번갈아가면서 사용해야하는데
// 과연 소스코드를 수정하는 방법이 맞는 것일까?
// 객체 생성부분을 누군가 대신해주는 설정으로 만든다
// 계속 바뀌는 부분만 설정파일로 빼는 것이다
// 2. XML : 스프링에게 지시하는 방법으로 코드를 변경
/*
* 지시서를 읽어서 활용하는 방법 지시서를 읽어 객체를 생성하고 조립해주는 인터페이스 객체 ApplicationContext
*/
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");// 변수의 이름으로 꺼내면 타입을 바꿔야함
ExamConsole console = context.getBean(ExamConsole.class); // 자료형명으로 꺼내보자
// 이경우 인터페이스형식에 참조될 수 있는 것을 줌
console.print();
// List<Exam> exams = new ArrayList<>();
// exams.add(new ScoreExam(1, 2, 3, 4)); // XML에서 추가 해보자
// new ArrayList(); // 생성자 인자로 Collection을 넣을 수 있다 이를 활용해 XML에서 추가하자
// setter가 없기때문에 이를 사용한다
List<Exam> exams = (List<Exam>) context.getBean("exams");
for (Exam e : exams)
System.out.println(e);
}
}
728x90
'Spring' 카테고리의 다른 글
@Component 사용법 ( 1 ) (0) | 2023.08.05 |
---|---|
@Autowired, @Qualifier 사용법 (0) | 2023.08.05 |
Inversion of Control Container ( Ioc Container ) (0) | 2023.06.14 |
Dependency Injection ( XML ) (0) | 2023.06.14 |
Dependency Injection ( 순수 Java ) (0) | 2023.06.14 |