способ указать один боб на другой весной xml - PullRequest
0 голосов
/ 24 октября 2019

Есть ли способ указать один компонент на другой, используя Spring XML SPring Expression Language (SPEL), кроме псевдонимов? string4 ниже работает с использованием псевдонимов. Но string3 нет. Как правильно написать string3? Есть ли способ написать это по буквам?

Цель состоит в том, чтобы создать 2 bean-компонента: string1 и string2. Могут быть другие виды объектов. Но String здесь, чтобы упростить пример. Другой объект будет запрашивать бин по имени, "string3". Он не знает, что такое string1 или string2;только то, что ему нужно string3. В xml мы можем сопоставить строку 3 со строкой 1 или строкой 2, в зависимости от обстоятельств развертывания.

Например, на сервере 1 мы указываем строку 3 на строку 1 в XML. На сервере 2 мы указываем строку 3 на строку 2 в XML. Это удерживает приложение от необходимости знать, нужны ли нам string1 или string2. Только в XML мы делаем это назначение. SoC

<?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"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-2.5.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="somePackage.SomeClass"/>

    <bean name="string1" id="string1" class="java.lang.String">
        <constructor-arg value="some string one"/>
    </bean>

    <bean name="string2" id="string2" class="java.lang.String">
        <constructor-arg value="another string two"/>
    </bean>

    <bean name="string3" id="string3" value="#{string1}"/>
    <!--
    <bean name="string3" id="string3" value="#{string2}"/>
    -->

    <!--
    <alias name="string2" alias="string4"/>
    -->
    <alias name="string1" alias="string4"/>

    <bean name="testBean" id="testBean" class="somePackage.SomeClass"/>

</beans>

Дополнительный вопрос: есть ли способ создать копию компонента, а не просто передать ссылку на тот же компонент? Что-то вроде value = "# {string1.clone ()}"

1 Ответ

1 голос
/ 04 ноября 2019

На основе официальной документации Spring 3.x :

Вы можете установить столько идентификаторов, сколько хотите для компонента, с двумя подходами:

  1. Укажите количество идентификаторов в атрибуте name, разделенных запятой (,), точкой с запятой (;) или пробелом.

  2. Использование <alias>. этот подход полезен, когда вы хотите указать на bean-компонент в другой системе / подсистеме, как он полностью описан в документации:

Указание всех псевдонимов, где фактически определен bean-компонентне всегда адекватно, однако. Иногда желательно ввести псевдоним для компонента, который определен в другом месте. Это обычно имеет место в больших системах, где конфигурация разделена между каждой подсистемой, каждая подсистема имеет свой собственный набор определений объектов. В метаданных конфигурации на основе XML вы можете использовать этот элемент для выполнения этого.

Итак, чтобы ответить на ваш вопрос, да, вы можете сделать это с атрибутом name

ДляБонусный вопрос, вам нужно использовать Bean Scopes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...