Appendix C. spring-beans_2_0.dtd

<?xml version="1.0" encoding="UTF-8"?>

<!--
	Spring XML Beans DTD
	Authors: Rod Johnson, Juergen Hoeller, Alef Arendsen, Colin Sampaleanu, Rob Harrop

	이것은 Spring BeanFactory가 관리하고 XmlBeanDefinitionReader(DefaultXmlBeanDefinitionParser를 가진)가 읽는 자바빈 객체의 명명공간(namespace)을 생성하는 간단하고 일관적인 방법을 정의한다. 

	대부분의 Spring기능을 사용하는 문서타입은 bean factory에 기초를 둔 웹 애플리케이션 컨텍스트를 포함한다.

	이 문서내 각각의 "bean" 요소는 자바빈을 정의한다. 대개 bean클래스가 자바빈 프라퍼티와/또는 생성자의 인자에 따라 명시된다.

	bean인스턴스는 "싱글톤" (공유 인스턴스) or "프로토타입"(독립적인 인스턴스)이 될수 있다. 더 많은 범위(scope)는 핵심 BeanFactory 구조의 상위에 내장되도록 가정되어서 이것의 일부가 아니다.

	bean사이의 참조는 제안된다. 이를테면 같은 factory(또는 조상(ancestor) factory)내 다른 bean을 위한 참조를 위해 자바빈 프라퍼티나 생성자의 인자를 셋팅한다.
	
	bean참조의 대안처럼 "내부 bean정의"가 사용될수 있다. 내부 bean정의의 싱글톤 플래그는 효과적으로 무시된다. 내부 bean은 대개 익명 프로토타입이다.
	
	bean프라퍼티 타입이나 생성자의 인자타입처럼 리스트, 세트, maps, 그리고 java.util.Properties를 위한 지원이 있다. 

	포맷이 간단하고, DTD가 충분하고 이 시점에 스키마가 필요하지 않다.

	DTD를 따르는 XML문서는 다음의 doctype를 선언해야만 한다.

	<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
		"http://www.springframework.org/dtd/spring-beans_2_0.dtd">
-->


<!--
	문서의 가장 상위(root). 문서는 bean 정의만, import만, 또는 둘의 혼합을 포함할수 있다. (대개 import가 먼저이다)
-->
<!ELEMENT beans (
	description?,
	(import | alias | bean)*
)>

<!--
	모든 bean정의를 위한 디폴트 값. "bean"레벨에 오버라이드될수 있다. 상세사항을 위해서 속성 정의를 보라.
-->
<!ATTLIST beans default-lazy-init (true | false) "false">
<!ATTLIST beans default-autowire (no | byName | byType | constructor | autodetect) "no">
<!ATTLIST beans default-dependency-check (none | objects | simple | all) "none">
<!ATTLIST beans default-init-method CDATA #IMPLIED>
<!ATTLIST beans default-destroy-method CDATA #IMPLIED>
<!ATTLIST beans default-merge (true | false) "false">

<!--
	요소는 인코딩된 요소의 목적을 설명하는 정보성 텍스트를 포함. 언제나 선택사항임. 
	XML bean정의 문서의 사용자 문서를 위해 가장 먼서 사용.
-->
<!ELEMENT description (#PCDATA)>


<!--
	import하기 위한 XML bean정의를 명시. 
-->
<!ELEMENT import EMPTY>

<!--
	import하기 위한 XML bean정의 파일의 상대적인 자원 위치. 
	예를 들어 "myImport.xml", "includes/myImport.xml" 또는 "../myImport.xml".
-->
<!ATTLIST import resource CDATA #REQUIRED>


<!--
	다른 정의 파일내 위치할수 있는 bean을 위한 별칭을 정의.
-->
<!ELEMENT alias EMPTY>

<!--
	별칭을 정의하기 위한 bean의 이름
-->
<!ATTLIST alias name CDATA #REQUIRED>

<!--
	bean의 위해 정의하는 별칭이름.
-->
<!ATTLIST alias alias CDATA #REQUIRED>


<!--
	하나의 bean을 정의

	bean정의는 생성자의 인자, 프라퍼티 값, 룩업 메소드, 그리고 교체된 메소드를 위한 내포된 태그를 포함한다. 
	같은 bean에서 생성자 삽입(constructor injection)과 setter삽입(setter injection)의 혼합은 명시적으로 지원된다. 
-->
<!ELEMENT bean (
	description?,
	(constructor-arg | property | lookup-method | replaced-method)*
)>

<!--
	참조 체크를 가능하게 하는 id에 의해 구별될수 있는 bean. 

	유효한 XML id에는 제약이 있다. 만약 당신이 XML id처럼 적합하지 않은 이름을 사용하는 자바코드내 
	당신의 bean을 참조하길 원한다면 선택사항인 "name" 속성을 사용하라. 아무것도 주어지지 않았다면 
	bean클래스 이름은 id (만약 그 이름을 가진 bean이 이미 있다면 "#2"처럼 접두사 적인 카운터를 
	가진)처럼 사용된다.
-->
<!ATTLIST bean id ID #IMPLIED>

<!--
	선택사항. id내 하나 이상의 별칭을 생성하기 위해 사용될수 있다. 다중 별칭은 많은 수의 공간이나 콤마 또는 세미콜론에 의해 분리될수 있다.
-->
<!ATTLIST bean name CDATA #IMPLIED>

<!--
	각각의 bean정의는 자식 bean정의를 위한 부모처럼 제공되는 상황을 제외하고 클래스의 완전한 형태의 
	이름을 명시해야만 한다. 
-->
<!ATTLIST bean class CDATA #IMPLIED>

<!--
	선택적으로 부모 bean정의를 명시한다. 
	
	아무것도 명시되지 않는다면 부모의 bean클래스가 사용되지만 이것을 오버라이드할수 있다. 
	나중의 경우 자식 클래스는 부모 클래스와 호환되어야만 한다. 이를테면 부모 클래스의 프라퍼티값과 
	생성자의 인자값을 받을수 있어야만 한다.
	
	자식 bean정의는 새로운 값을 추가하는 선택사항을 가지고 생성자의 인자값, 프라퍼티 값 그리고 부모로부터 
	오버라이드된 메소드를 상속할것이다. 만약 init 메소드, destroy 메소드, factory bean 그리고/또는 factory 메소드가 
	명시되었다면 그것들은 부모 셋팅에 관련하여 오버라이드 할것이다. 

	남아있는 셋팅은 자식 정의(autowire모드, 의존성 체크, 싱글톤, 늦은 초기화(lazy init)에 의존하여)로 부터 가져올것이다. 
-->
<!ATTLIST bean parent CDATA #IMPLIED>

<!--
	이 bean이 "abstract"인지에 대한 값. 견고한 자식 bean정의를 위한 부모처럼 제공되지만 자체적으로는 인스턴스화되지 않는다. 디폴트는 "false". 특정 bean을 인스턴스화 하는것을 시도하지 않도록 bean factory에게 알리기 위해서는 "true"로 명시하라. 

	노트 : 이 속성은 자식 bean정의에 의해 상속되지 않을것이다. 나아가 이것은 견고한 bean정의마다 명시될 필요가 있다. 
-->
<!ATTLIST bean abstract (true | false) "false">

<!--
	이 bean이 "singleton"(id를 가진 getBean()을 호출하여 반환될 공유 인스턴스)이거나 getBean()을 호출하여 독립적인 
	인스턴스를 만드는 "prototype"인지에 대한 값. 디폴트는 singleton.
	
	singleton이 가장 공통적으로 사용된다. 그리고 멀티-쓰레드 서비스 객체를 위해 이상적이다. 

	노트 : 이 속성은 자식 bean정의에 의해 상속되지 않을것이다. 나아가, 이것은 견고한 bean정의마다 명시될 필요가 있다. 
-->
<!ATTLIST bean singleton (true | false) "true">

<!--
	bean이 늦게(lazily) 초기화되는지에 대한 값. 
	false라면 이것은 singletons의 초기화를 수행하는 bean factory에 의해 시작될때 인스턴스화될것이다. 

	노트 : 이 속성은 자식 bean정의에 의해 상속되지 않을것이다. 나아가 이것은 견고한 bean정의마다 명시될 필요가 있다. 
-->
<!ATTLIST bean lazy-init (true | false | default) "default">

<!--
	bean프라퍼티를 "autowire"할지에 대한 제어를 하는 선택적인 속성.
	이것은 XML bean정의 파일내 명시적으로 코드될 필요가 없는 bean 참조내 마법적인 처리이다. 
	하지만 Spring은 의존성을 해결한다. 
	
	5가지의 모드가 있다.

	1. "no"
	전통적인 Spring 디폴트. 마법같은 wiring이 없다. bean참조는 <ref> 요소를 통해 XML파일내 정의되어야만 
	한다. 우리는 대부분의 경우 좀더 명시적으로 문서를 만드는것처럼 이것을 추천한다. 

	2. "byName"
	프라퍼티 이름에 의한 autowiring. Cat클래스의 bean이 dog프라퍼티를 드러낸다면 Spring은 이것을 현재 factory내 
	"dog" bean의 값으로 셋팅하는것을 시도할것이다. 이름에 의한 bean이 대응되는것이 없다면 아무것도 발생하지 
	않는다. 이 경우 에러를 발생시키기 위해 dependency-check="objects" 를 사용하라.

	3. "byType"
	bean factory내 프라퍼티 타입의 bean이 정확하게 한개가 있다면 autowiring한다. 만약 하나 이상이 있다면 
	치명적인 에러가 발생하고 당신은 bean을 위한 byType autowiring을 사용할수 없다. 만약 하나도 없다면 
	어떠한 특별한 일도 발생하지 않는다. 이 경우 에러를 발생시키기 위해서는 dependency-check="objects"를 사용하라.

	4. "constructor"
	생성자의 인자를 위한 "byType"과 비슷하다. bean factory내 생성자의 인자 타입의 bean이 정확하게 하나가 
	존재하는 상황이 아니라면 치명적인 에러가 발생한다.

	5. "autodetect"
	bean 클래스의 자체 분석을 통해 "constructor" 나 "byType"을 사용한다. 만약 디폴트 생성자가 발견된다면 
	"byType"이 적용된다. 

	뒤의 두가지는 PicoContainer와 유사하고 작은 이름공간(namespace)을 위한 설정을 위해 bean factory를  
	간단하게 만든다. 하지만 좀더 큰 애플리케이션을 위해 표준적인 Spring 행위처럼 잘 작동하지는 않는다. 
	
	명시적인 의존성이다. 이를테면 "property" 와 "constructor-arg" 요소는 언제나 autowiring를 오버라이드한다. 
	autowire행위는 모든 autowiring이 완성된 후 수행될 의존성 체크와 조합될수 있다. 

	노트 : 이 속성은 자식 bean정의에 의해 상속되지 않을것이다. 나아가 이것은 견고한 bean정의마다 명시될 필요가 있다. 
-->
<!ATTLIST bean autowire (no | byName | byType | constructor | autodetect | default) "default">

<!--
	이 프라퍼티에서 표현되는 모든 bean의존성이 만족하는지에 대해 체크할지 제어하는 선택적인 속성. 
	디폴트는 의존성 체크를 하지 않는다. 
	
	"simple" 원시 타입과 문자열 타입을 포함한 의존성 체크.
	"object" 는 협력자(factory내 다른 bean)
	"all" 위 두타입 모두를 포함하는 의존성 체크.

	노트 : 이 속성은 자식 bean정의에 의해 상속되지 않을것이다. 나아가 이것은 견고한 bean정의마다 명시될 필요가 있다. 
-->
<!ATTLIST bean dependency-check (none | objects | simple | all | default) "default">

<!--
	초기화시 이 bean이 의존하는 bean의 이름.
	bean factory는 bean이 초기화되기 전에 보장할것이다. 
	
	의존성은 bean프라퍼티나 생성자의 인자를 통해 대개 표현된다. 이 프라퍼티는 시작시 정적이나 
	데이터베이스 준비처럼 다른 종류의 의존성을 위해 필요할것이다.

	노트 : 이 속성은 자식 bean정의에 의해 상속되지 않을것이다. 나아가 이것은 견고한 bean정의마다 명시될 필요가 있다. 
-->
<!ATTLIST bean depends-on CDATA #IMPLIED>

<!--
	bean프라퍼티를 셋팅한 후 호출하기 위한 사용자정의 초기화 메소드의 이름을 위한 선택적인 속성. 
	메소드는 인자를 가지지 않아야 한다. 하지만 어떤 예외를 던질것이다. 
-->
<!ATTLIST bean init-method CDATA #IMPLIED>

<!--
	bean factory가 닫힐 때 호출하기 위한 사용자 정의 회수(destroy) 메소드의 이름을 위한 선택적인 속성. 
	메소드는 인자를 가지지 않아야 한다. 하지만 어떤 예외를 던질것이다. 
	메모 : 싱글톤 bean에서는 오직 한번만 호출된다.
-->
<!ATTLIST bean destroy-method CDATA #IMPLIED>

<!--
	객체를 생성하기 위해 사용하는 factory메소드의 이름을 명시하는 선택적인 속성. 
	만일 인자를 가진다면 factory메소드를 위한 인자를 명시하기 위해 constructor-arg 요소를 사용하라. 
	autowiring은 factory메소드에 적용하지 않는다. 
	
	"class"속성이 존재한다면 factory메소드는 bean정의의 "class"속성에 의해 명시되는 클래스의 정적 메소드가 
	될것이다. 예를 들어 factory메소드가 생성자의 대안으로 사용될때 종종 이것은 생성된 객체처럼 같은 
	클래스가 될것이다.  어쨌든. 이것은 다른 클래스가 될수 있다. 이 경우 생성된 객체는 "class"속성내 명시된 
	클래스가 되지 "않을"것이다. 이것은 FactoryBean행위와 유사하다. 
	
	"factory-bean"속성이 존재한다면 "class"속성은 사용되지 않는다. 그리고 factory메소드가 명시된 bean이름을 
	가진 getBean호출로 부터 반환된 객체의 인스턴스 메소드가 될것이다. factory bean은 싱글톤이나 
	프로토타입처럼 정의될수 있다. 
	
	factory메소드는 많은 수의 인자를 가질수 있다. autowiring은 지원되지 않는다. factory-method속성과 결합되는 
	인덱스화된 constructor-arg을 사용하라. 
	
	setter 삽입(injection)은 factory메소드와 결합되서 사용될수 있다. 메소드 삽입(injection)은 결합되어 사용될수 
	없다. factory메소드가 컨테이너가 bean생성할때 사용될 인스턴스를 반환한다. 
-->
<!ATTLIST bean factory-method CDATA #IMPLIED>

<!--
	factory-metohd사용을 위한 class속성에 대한 대안이다. 이것이 명시된다면 class속성은 사용되지 않는다. 
	이것은 관련 factory메소드를 포함하는 현재 또는 상위 factory내 bean의 이름으로 셋팅될수 있다. 
	이것은 factory자체가 의존성 삽입과 사용될 인스턴스(정적인것 보다) 메소드를 사용하여 설정되는것을 허용한다.
-->
<!ATTLIST bean factory-bean CDATA #IMPLIED>


<!--
	bean정의는 생성자의 인자를 하나를 명시하거나 그 이상을 명시할수 있다. 
	이것은 "autowire constructor"에 대안으로 사용된다. 
	Arguments correspond to either a specific index of the constructor argument
	list or are supposed to be matched generically by type.

	메모 : 하나의 일반적인 인자의 값은 여러번 잠재적으로 대응되더라도 한번만 사용된다. 

	constructor-arg 요소는 정적이나 인스턴스 factory메소드를 사용하여 bean을 생성하기 위해 factory-method요소와 
	결합되어 사용된다. 
-->
<!ELEMENT constructor-arg (
	description?,
	(bean | ref | idref | value | null | list | set | map | props)?
)>

<!--
	constructor-arg태그는 생성자의 안자 리스트내 정확한 인덱스를 명시하기 위해 index속성을 선택적으로 가진다. 
	모호함(이를테면 같은 타입의 두개의 인자의 경우)을 피하기 위해서만 필요하다. 
-->
<!ATTLIST constructor-arg index CDATA #IMPLIED>

<!--
	constructor-arg태그는 선택적으로 생성자의 인자 타입을 정확하게 명시하기 위한 type속성을 가질수 있다. 
	모호함(이를테면 문자열로 부터 형변환될수 있는 하나의 인자를 가지는 생성자)을 피하기 위해서만 필요하다. 
-->
<!ATTLIST constructor-arg type CDATA #IMPLIED>

<!--
  자식 요소인 "ref bean="에 단순화(short-cut)된 대안.
-->
<!ATTLIST constructor-arg ref CDATA #IMPLIED>

<!--
  자식 요소인 "value"에 단순화(short-cut)된 대안.
-->
<!ATTLIST constructor-arg value CDATA #IMPLIED>


<!--
	bean정의는 프라퍼티를 가지지 않거나 그 이상을 가질수 있다. property요소는 bean클래스에 의해 드러나는 
	자바빈 setter메소드와 일치한다. Spring은 원시타입, 같거나 관련된 factory내 다른 bean에 대한 참조, 리스트, 
	map 그리고 프라퍼티를 지원한다. 
-->
<!ELEMENT property (
	description?,
	(bean | ref | idref | value | null | list | set | map | props)?
)>

<!--
	property name 속성은 자바빈 프라퍼티의 이름이다. 이것은 자바빈 관례(conventions)를 따른다. 
	"age"의 이름은 setAge()와 일치하고 선택적으로 getAge()메소드와 일치할것이다. 
-->
<!ATTLIST property name CDATA #REQUIRED>

<!--
  자식 요소인 "ref bean="에 단순화(short-cut)된 대안.
-->
<!ATTLIST property ref CDATA #IMPLIED>

<!--
  자식 요소인 "value"에 단순화(short-cut)된 대안.
-->
<!ATTLIST property value CDATA #IMPLIED>


<!--
	룩업 메소드는 주어진 메소드를 오버라이드 하기 위한 IoC컨테이너를 야기한다. bean속성내 
	주어진 이름으로 bean을 반환한다. 이것은 메소드 삽입(injection)의 형태이다. 이것은 
	수행시 싱글톤이 아닌 인스턴스를 위한 getBean()호출을 만들기 위해 BeanFactoryAware인터페이스를 
	구현하는것의 대안처럼 특별히 유용하다. 이 경우 메소드 삽입(injection)은 다소 덜 침략적인(invasive) 
	대안이다. 
-->
<!ELEMENT lookup-method EMPTY>

<!--
	룩업 메소드의 이름. 이 메소드는 인자를 가져서는 안된다. 
-->
<!ATTLIST lookup-method name CDATA #IMPLIED>

<!--
	룩업 메소드가 해석하기 위한 현재 또는 상위 factory내 bean의 이름. 
	모든 호출의 구별되는 인스턴스를 반환할 룩업 메소드의 경우 종종 bean은 프로토타입이 될것이다. 
	이것은 한개의 쓰레드 객체를 위해 유용하다. 
-->
<!ATTLIST lookup-method bean CDATA #IMPLIED>


<!--
	룩업 메소드 기법과 유사하다. replaced-method요소는 메소드를 오버라이딩 하는 IoC컨테이너를 
	제어하기 위해 사용된다. 이 기법은 임의의 코드를 가진 메소드의 오버라이딩을 허용한다. 
-->
<!ELEMENT replaced-method (
	(arg-type)*
)>

<!--
	IoC컨테이너에 의해 대체되는 구현물의 메소드 이름. 
	만약 이 메소드가 오버라이드되지 않는다면 arg-type 하위 요소를 사용할 필요가 없다. 
	만약 이 메소드가 오버라이드된다면 arg-type 하위 요소는 메소드를 위한 정의를 모두 오버라이드하기 
	위해 사용되어야만 한다. 
-->
<!ATTLIST replaced-method name CDATA #IMPLIED>

<!--
	현재또는 상위 factory내 MethodReplacer인터페이스 구현물의 bean이름. 
	이것은 싱글톤이나 프로토타입 bean이 될수 있다. 만약 프로토타입이라면 새로운 인스턴스는 각각의 
	메소드 대체를 위해 사용될것이다. 싱글톤 사용이 일반적이다. 
-->
<!ATTLIST replaced-method replacer CDATA #IMPLIED>

<!--
	replaced-method의 하위요소는 메소드 오버라이드할때 대체되는 메소드를 위한 인자를 확인한다. 
-->
<!ELEMENT arg-type (#PCDATA)>

<!--
	문자열처럼 오버라이드된 메소드 인자의 타입을 명시. 
	편의를 위해 이것은 FQN의 부분 문자열이 될수 있다. 이를테면 다음의 모두는 "java.lang.String"와 
	대응될것이다. 
	- java.lang.String
	- String
	- Str

	인자의 숫자처럼 체크될것이다. 이 편의는 종종 타이핑을 줄이기 위해 사용될수 있다. 
-->
<!ATTLIST arg-type match CDATA #IMPLIED>


<!--
	이 factory나 외부 factory(부모나 포함된 factory)내 다른 bean에 대한 참조를 정의.
-->
<!ELEMENT ref EMPTY>

<!--
	참조는 대상 bean의 이름을 명시해야만 한다. "bean"속성은 수행시 체크되기 위한 컨텍스트내 어떤 
	bean의 이름을 참조할수 있다. "local"속성을 사용하는 local참조는 bean id들을 사용한다. 
	그것들은 이 DTD에 의해 체크될수 있다. 게다가 같은 bean factory XML파일내 참조를 위해 선호된다. 
-->
<!ATTLIST ref bean CDATA #IMPLIED>
<!ATTLIST ref local IDREF #IMPLIED>
<!ATTLIST ref parent CDATA #IMPLIED>


<!--
	이 factory나 외부 factory(부모또는 포함된 factory)내 다른 bean의 id가 되어야만 하는 문자열 프라퍼티 
	값을 정의. 정규의 "value"요소는 같은 효과를 위해 대신 사용될수 있다. 이 경우 idref를 사용하는것은 
	xml파서에 의해 local bean id의 휴효성 체크와 헬퍼 툴(helper tool)에 의한 이름 완성을 허용한다. 
-->
<!ELEMENT idref EMPTY>

<!--
	ID refs는 대상 bean의 이름을 명시해야만 한다. "bean"속성은 bean factory구현물에 의해 수행시 
	잠재적으로 체크될 컨텍스트내 어느 bean의 이름을 참조할수 있다. "local" 속성을 사용하는 local참조는 
	bean id를 사용한다. 그것들은 이 DTD에 의해 체크될수 있다. 게다가 같은 bean factory XML파일내 
	참조를 위해 선호된다. 
-->
<!ATTLIST idref bean CDATA #IMPLIED>
<!ATTLIST idref local IDREF #IMPLIED>


<!--
	프라퍼티 값의 문자열 표현을 포함한다. 이 프라퍼티는 문자열이나 자바빈 PropertyEditor를 사용하여 
	요구되는 타입으로 변환될수 있다. 애플리케이션 개발자가 문자열을 객체로 형변환할수 있는 
	사용자정의 PropertyEditor구현물을 쓰는것이 가능하다. 
	
	간단한 객체만 추천된다. 다른 bean에 대한 참조를 가지고 자바빈 프라퍼티를 활성화하여 좀더 복잡한 
	객체를 설정하라. 
-->
<!ELEMENT value (#PCDATA)>

<!--
	value태그는 값이 형변환될수 있는 정확한 타입을 명시하기 위한 선택적인 type속성을 가질수 있다. 
	대상 프라퍼티나 생성자의 인자의 타입이 일반적(generic)일때만 필요하다. 예를 들어, 이 경우 
	collection요소.
-->
<!ATTLIST value type CDATA #IMPLIED>

<!--
	자바 null값을 표시한다. 빈 "value"태그는 빈 문자열로 해석하기 때문에 특별히 PropertyEditor가 그렇게 
	하지 않는다면 null값으로 해석하지 않을것이다. 
-->
<!ELEMENT null (#PCDATA)>


<!--
	리스트는 다중 내부 bean, ref, collection, 또는 value요소를 포함할수 있다. 자바 list는 포함되지 않는다. 
	자바 1.5내 일반적인 지원에 참조는 강력하게 형태화(typed)될것이다. 리스트는 또한 배열타입으로 맵핑될수 
	있다. 필요한 규칙은 BeanFactory에 의해 자동적으로 수행된다. 
-->
<!ELEMENT list (
	(bean | ref | idref | value | null | list | set | map | props)*
)>

<!-- 부모/자식 bean을 사용할때 collection을 병합하는 것을 가능하게 하기/가능하지 않게 하기 -->
<!ATTLIST list merge (true | false | default) "default">


<!--
	세트는 다중 내부 bean, ref, collection, 또는 value요소를 포함할수 있다. 자바 set은 포함되지 않는다. 
	자바 1.5내 일반적인 지원에 참조는 강력하게 형태화(typed)될것이다.
-->
<!ELEMENT set (
	(bean | ref | idref | value | null | list | set | map | props)*
)>

<!-- 부모/자식 bean을 사용할때 collection을 병합하는 것을 가능하게 하기/가능하지 않게 하기 -->
<!ATTLIST set merge (true | false | default) "default">


<!--
	Spring map은 문자열 key로 객체를 맵핑한다. map은 아마도 비어있을것이다. 
-->
<!ELEMENT map (
	(entry)*
)>

<!-- 부모/자식 bean을 사용할때 collection을 병합하는 것을 가능하게 하기/가능하지 않게 하기 -->
<!ATTLIST map merge (true | false | default) "default">

<!--
	map항목은 내부 bean, ref, value, 또는 collection이 될수 있다. 
	항목의 key는 "key"속성이나 자식 요소에 의해 주어진다. 
-->
<!ELEMENT entry (
  key?,
	(bean | ref | idref | value | null | list | set | map | props)?
)>

<!--
	각각의 map요소는 속성이나 자식 요소처럼 이것의 key를 명시해야만 한다. 
	key속성은 언제나 문자열값이다. 
-->
<!ATTLIST entry key CDATA #IMPLIED>

<!--
	"ref bean=" 자식 요소를 가진 "key"요소에 단순화된 대안.
-->
<!ATTLIST entry key-ref CDATA #IMPLIED>

<!--
  자식 요소인 "value"에 단순화된 대안.
-->
<!ATTLIST entry value CDATA #IMPLIED>

<!--
	자식 요소인 "ref bean="에 단순화된 대안.
-->
<!ATTLIST entry value-ref CDATA #IMPLIED>

<!--
	key요소는 내부 bean, ref, value, 또는 colllection을 포함할수 있다. 
-->
<!ELEMENT key (
	(bean | ref | idref | value | null | list | set | map | props)
)>


<!--
	props요소는 문자열이 되어야만 하는 값내에서 map요소와 다르다. 
	props는 아마도 비어있을것이다. 
-->
<!ELEMENT props (
	(prop)*
)>

<!-- 부모/자식 bean을 사용할때 collection을 병합하는 것을 가능하게 하기/가능하지 않게 하기 -->
<!ATTLIST props merge (true | false | default) "default">

<!--
	요소 내용은 프라퍼티의 문자열 값이다. 
	여백은 전형적인 XML형태에 의해 야기되는 원치않는 여백을 피하기 위해 잘라낸다.
-->
<!ELEMENT prop (#PCDATA)>

<!--
	각각의 프라퍼티 요소는 이것의 key를 명시해야만 한다. 
-->
<!ATTLIST prop key CDATA #REQUIRED>