Как следует из названия, теги util предназначены для решения распространенных проблем со служебным конфигурированием, таких как конфигурирование коллекций, обращение к константам и так далее. Чтобы использовать теги в схеме util, необходимо написать следующую преамбулу (вводную часть) в верхней части вашего конфигурационного XML-файла для Spring (текст в фрагменте ссылается на правильную схему, чтобы теги в пространстве имен util стали доступны):

<?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:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
        <!-- определения бинов здесь  -->
</beans>

Использование <util:constant/>

Рассмотрим следующее определение бина:

<bean id="..." class="...">
    <property name="isolation">
        <bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE"
                class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" />
    </property>
</bean>

В предыдущей конфигурации реализация FactoryBean (FieldRetrievingFactoryBean) в Spring используется для установки значения свойства isolation в бинах на значение константы java.sql.Connection.TRANSACTION_SERIALIZABLE. Все замечательно, но выглядит слишком перегружено и (без необходимости) раскрывает "нутро" Spring конечному пользователю.

Следующая версия на основе XML Schema более лаконична, четко выражает намерение разработчика ("внедрить это константное значение") и лучше читается:

<bean id="..." class="...">
    <property name="isolation">
        <util:constant static-field="java.sql.Connection.TRANSACTION_SERIALIZABLE"/>
    </property>
</bean>

Установка свойства бина или аргумента конструктора из значения поля

FieldRetrievingFactoryBean – это FactoryBean, который получает значение static или нестатического поля. Обычно он используется для получения public static final констант, которые затем могут быть использованы для установки значения свойства или аргумента конструктора для другого бина.

В следующем примере показано, как статическое поле открывается с помощью свойства staticField:

<bean id="myField"
        class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
    <property name="staticField" value="java.sql.Connection.TRANSACTION_SERIALIZABLE"/>
</bean>

Существует также удобная c практической точки зрения форма, когда статическое поле указывается в качестве имени бина, как показано в следующем примере:

<bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE"
        class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/>

Это означает, что больше нельзя выбрать id бина (поэтому любой другой бин, который ссылается на него, также должен использовать это более длинное имя), но данная форма очень лаконична для определения и очень удобна для использования в качестве внутреннего бина, поскольку id не нужно указывать для ссылки на бин, как это показано в следующем примере:

<bean id="..." class="...">
    <property name="isolation">
        <bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE"
                class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" />
    </property>
</bean>

Вы также можете получить доступ к нестатическому полю (экзмпляра) другого бина, как описано в документации API-интерфейса для класса FieldRetrievingFactoryBean.

В Spring внедрять перечисляемые величины в бины в качестве свойств или аргументов конструктора очень легко. Вам на самом деле даже не нужно ничего делать или знать о внутреннем устройстве Spring (или даже о таких классах, как FieldRetrievingFactoryBean). Следующий пример перечисления показывает, насколько простым может быть внедрение перечисляемых величин:

Java
package javax.persistence;
public enum PersistenceContextType {
    TRANSACTION,
    EXTENDED
}
Kotlin
package javax.persistence
enum class PersistenceContextType {
    TRANSACTION,
    EXTENDED
}

Теперь рассмотрим следующий сеттер типа PersistenceContextType и соответствующее определение бина:

Java
package example;
public class Client {
    private PersistenceContextType persistenceContextType;
    public void setPersistenceContextType(PersistenceContextType type) {
        this.persistenceContextType = type;
    }
}
Kotlin
package example
class Client {
    lateinit var persistenceContextType: PersistenceContextType
}
<bean class="example.Client">
    <property name="persistenceContextType" value="TRANSACTION"/>
</bean>

Использование <util:property-path/>

Рассмотрим следующий пример:

<!-- целевой бин, на который нужно ссылаться по имени  -->
<bean id="testBean" class="org.springframework.beans.TestBean" scope="prototype">
    <property name="age" value="10"/>
    <property name="spouse">
        <bean class="org.springframework.beans.TestBean">
            <property name="age" value="11"/>
        </bean>
    </property>
</bean>
<!-- результат 10, что является значением свойства 'age' bean 'testBean' -->
<bean id="testBean.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>

В предыдущей конфигурации реализация FactoryBean (PropertyPathFactoryBean) в Spring используется для создания бина (типа int) под названием testBean.age, значение которого равно свойству age бина testBean.

Теперь рассмотрим следующий пример, в котором добавлен добавляет <util:property-path/> :

<!-- целевой бин, на который нужно ссылаться по имени  -->
<bean id="testBean" class="org.springframework.beans.TestBean" scope="prototype">
    <property name="age" value="10"/>
    <property name="spouse">
        <bean class="org.springframework.beans.TestBean">
            <property name="age" value="11"/>
        </bean>
    </property>
</bean>
<!-- результат 10, что является значением свойства 'age' bean 'testBean' -->
<util:property-path id="name" path="testBean.age"/>

Значение атрибута path элемента <property-path/> следует форме beanName.beanProperty. В данном случае он принимает свойство age бина с именем testBean. Значение этого свойства age равно 10.

Использование <util:property-path/> для установки свойства бина или аргумента конструктора

PropertyPathFactoryBean – это FactoryBean, которая вычисляет путь свойства для заданного целевого объекта. Целевой объект может быть задан напрямую или через имя бина. Затем можно использовать это значение в другом определении бина в качестве значения свойства или аргумента конструктора.

В следующем примере путь используется только по отношению к другому бину, по имени:

<!-- целевой бин, на который нужно ссылаться по имени  -->
<bean id="person" class="org.springframework.beans.TestBean" scope="prototype">
    <property name="age" value="10"/>
    <property name="spouse">
        <bean class="org.springframework.beans.TestBean">
            <property name="age" value="11"/>
        </bean>
    </property>
</bean>
<!-- получаем результат 11, который является значением свойства "spouse.age" бина "person" -->
<bean id="theAge"
        class="org.springframework.beans.factory.config.PropertyPathFactoryBean">
    <property name="targetBeanName" value="person"/>
    <property name="propertyPath" value="spouse.age"/>
</bean>

В следующем примере путь вычисляется по внутреннему бину:

<!-- получаем результат 12, который является значением свойства "age" внутреннего бина  -->
<bean id="theAge"
        class="org.springframework.beans.factory.config.PropertyPathFactoryBean">
    <property name="targetObject">
        <bean class="org.springframework.beans.TestBean">
            <property name="age" value="12"/>
        </bean>
    </property>
    <property name="propertyPath" value="age"/>
</bean>

Существует также краткая форма, в которой имя бина является путем к свойству. В следующем примере показана сокращенная форма:

<!-- в результате получается 10, что является значением свойства "age" бина "person" -->
<bean id="person.age"
        class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>

Эта форма означает отсутствие выбора в имени бина. Любая ссылка на него также должна использовать тот же id, который является путем. Если он используется как внутренний бин, на него вообще не нужно ссылаться, что и продемонстрировано в следующем примере:

<bean id="..." class="...">
    <property name="age">
        <bean id="person.age"
                class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>
    </property>
</bean>

Можно специально задать тип результата в фактическом определении. Это не обязательно для большинства случаев использования, но иногда может быть практично. См. javadoc для получения дополнительной информации об этой функции.

Использование <util:properties/>

Рассмотрим следующий пример:

<!-- создает экземпляр java.util.Properties со значениями, загруженными из указанного места  -->
<bean id="jdbcConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="location" value="classpath:com/foo/jdbc-production.properties"/>
</bean>

В предыдущей конфигурации реализация FactoryBean (PropertiesFactoryBean) в Spring используется для создания экземпляра java.util.Properties со значениями, загруженными из предоставленного местоположения Resource.

В следующем примере для более краткого представления используется элемент util:properties:

<!-- создает экземпляр java.util.Properties со значениями, загруженными из указанного места  -->
<util:properties id="jdbcConfiguration" location="classpath:com/foo/jdbc-production.properties"/>

Использование <util:list/>

Рассмотрим следующий пример:

<!-- создает экземпляр java.util.List со значениями, загруженными из предоставленного "sourceList"  -->
<bean id="emails" class="org.springframework.beans.factory.config.ListFactoryBean">
    <property name="sourceList">
        <list>
            <value>pechorin@hero.org</value>
            <value>raskolnikov@slums.org</value>
            <value>stavrogin@gov.org</value>
            <value>porfiry@gov.org</value>
        </list>
    </property>
</bean>

В предыдущей конфигурации реализация FactoryBean (ListFactoryBean) в Spring используется для создания экземпляра java.util.List и его инициализации со значениями, взятыми из предоставленного sourceList.

В следующем примере используется элемент <util:list/> для более краткого представления:

<!-- создает экземпляр java.util.List с заданными значениями  -->
<util:list id="emails">
    <value>pechorin@hero.org</value>
    <value>raskolnikov@slums.org</value>
    <value>stavrogin@gov.org</value>
    <value>porfiry@gov.org</value>
</util:list>

Вы также можете управлять точным типом создаваемого и заполняемого List, используя атрибут list-class в элементе <util:list/>. Например, если действительно необходимо, чтобы был создан java.util.LinkedList, то можно использовать следующую конфигурацию:

<util:list id="emails" list-class="java.util.LinkedList">
    <value>jackshaftoe@vagabond.org</value>
    <value>eliza@thinkingmanscrumpet.org</value>
    <value>vanhoek@pirate.org</value>
    <value>d'd'Arcachon@nemesis.org</value>
</util:list>

Если атрибут list-class не указан, контейнер выбирает реализацию List.

Использование <util:map/>

Рассмотрим следующий пример:

<!-- создает экземпляр java.util.Map со значениями, загруженными из предоставленного "sourceMap"  -->
<bean id="emails" class="org.springframework.beans.factory.config.MapFactoryBean">
    <property name="sourceMap">
        <map>
            <entry key="pechorin" value="pechorin@hero.org"/>
            <entry key="raskolnikov" value="raskolnikov@slums.org"/>
            <entry key="stavrogin" value="stavrogin@gov.org"/>
            <entry key="porfiry" value="porfiry@gov.org"/>
        </map>
    </property>
</bean>

В предыдущей конфигурации реализация FactoryBean (MapFactoryBean) в Spring используется для создания экземпляра java.util.Map, инициализированного при помощи пар ключ-значение, взятыми из предоставленного "sourceMap".

В следующем примере используется элемент <util:map/> для более краткого представления:

<!-- cсоздает экземпляр java.util.Map при помощи заданных пар ключ-значение  -->
<util:map id="emails">
    <entry key="pechorin" value="pechorin@hero.org"/>
    <entry key="raskolnikov" value="raskolnikov@slums.org"/>
    <entry key="stavrogin" value="stavrogin@gov.org"/>
    <entry key="porfiry" value="porfiry@gov.org"/>
</util:map>

Вы также можете управлять точным типом создаваемого и заполняемого Map, используя атрибут 'map-class' в элементе <util:map/>. Например, если действительно необходимо, чтобы был создан экземпляр java.util.TreeMap, то можно использовать следующую конфигурацию:

<util:map id="emails" map-class="java.util.TreeMap">
    <entry key="pechorin" value="pechorin@hero.org"/>
    <entry key="raskolnikov" value="raskolnikov@slums.org"/>
    <entry key="stavrogin" value="stavrogin@gov.org"/>
    <entry key="porfiry" value="porfiry@gov.org"/>
</util:map>

Если атрибут "map-class" не указан, контейнер выбирает реализацию Map.

Использование <util:set/>

Рассмотрим следующий пример:

<!-- создает экземпляр java.util.Set со значениями, загруженными из предоставленного "sourceSet"  -->
<bean id="emails" class="org.springframework.beans.factory.config.SetFactoryBean">
    <property name="sourceSet">
        <set>
            <value>pechorin@hero.org</value>
            <value>raskolnikov@slums.org</value>
            <value>stavrogin@gov.org</value>
            <value>porfiry@gov.org</value>
        </set>
    </property>
</bean>

В предыдущей конфигурации реализация FactoryBean (SetFactoryBean) в Spring используется для создания экземпляра java.util.Set, инициализированного со значениями, взятыми из предоставленного sourceSet.

В следующем примере используется элемент <util:set/> для более краткого представления:

<!-- создает экземпляр java.util.Set с заданными значениями  -->
<util:set id="emails">
    <value>pechorin@hero.org</value>
    <value>raskolnikov@slums.org</value>
    <value>stavrogin@gov.org</value>
    <value>porfiry@gov.org</value>
</util:set>

Вы также можете управлять точным точным типом создаваоемого и заполняемого Set, используя атрибут set-class в элементе <util:set/>. Например, если действительно необходимо, чтобы был создан экземпляр java.util.TreeSet, то можно использовать следующую конфигурацию:

<util:set id="emails" set-class="java.util.TreeSet">
    <value>pechorin@hero.org</value>
    <value>rraskolnikov@slums.org</value>
    <value>stavrogin@gov.org</value>
    <value>porfiry@gov.org</value>
</util:set>

Если атрибут set-class не указан, контейнер выбирает реализацию Set.