У меня есть объект Java, который может настраиваться с учетом описания конфигурации XML (он также требует других описаний, но в данный момент меня интересует XML). Мне интересно, могу ли я встроить описание XML непосредственно в описание контекста приложения Spring. Я представляю себе что-то вроде:
<bean id = "myXMLConfiguredBean" class = "com.example.Foo">
<constructor-arg type = "xml">
<myconfig xmlns = "http://example.com/foo/config">
<bar>42</bar>
</myconfig>
</constructor-arg>
</bean>
но я понятия не имею, возможно ли это - или что-то в этом роде. Я понимаю, что могу встроить myconfig в раздел CDATA, но это кажется немного некрасивым.




Spring XSD позволяет <constructor-arg> содержать любой XML через:
<xsd:element name = "constructor-arg">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref = "description" minOccurs = "0" />
<xsd:choice minOccurs = "0" maxOccurs = "1">
<xsd:element ref = "bean" />
<xsd:element ref = "ref" />
<xsd:element ref = "idref" />
<xsd:element ref = "value" />
<xsd:element ref = "null" />
<xsd:element ref = "list" />
<xsd:element ref = "set" />
<xsd:element ref = "map" />
<xsd:element ref = "props" />
<!-- Any XML -->
<xsd:any namespace = "##other" processContents = "strict" />
</xsd:choice>
</xsd:sequence>
...
</xsd:complexType>
</xsd:element>
Где атрибуты processContents могут иметь один из три значения
strict: There must be a top-level declaration for the item available, or the item must have an
xsi:type, and the item must be ·valid· as appropriate.
Итак, пока ваш XML-файл конфигурации имеет схему и вы правильно ее импортируете, это должно работать.
Затем вам нужно будет зарегистрировать PropertyEditor для вашего XML, используя CustomEditorConfigurer
Надеюсь это поможет
Разве не было бы чище, если бы у вашего bean-компонента было свойство, указывающее ему местоположение файла конфигурации, и он загружал бы конфигурацию из пути к классам (или абсолютного местоположения в файловой системе)? Таким образом, ваша конфигурация Spring выглядит чище, и вам будет проще редактировать XML-конфигурацию вашего bean-компонента, поскольку она находится в отдельном файле.
Возможно, вы даже сможете сделать это, используя функцию ресурсов в контексте приложения Spring.