본문 바로가기
Spring

XML 사용법

by Coarti 2023. 8. 5.

[ 이전 글 ]

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