Главная » Spring » Общие абстрактные свойства Spring

0

В конкурсе талантов «Spring Idol» может быть несколько участ- ников с музыкальными способностями. Как было показано выше, у нас есть несколько музыкантов, исполняющих мелодии на своих инструментах. Но в конкурсе могут также участвовать певцы.

Предположим, что в конкурсе талантов «Spring Idol» имеются два участника, певец и гитарист, исполняющие одну и ту же песню. При конфигурировании их в виде разных компонентов их объявления могут выглядеть, как показано ниже:

<bean id="taylor"

class="com.springinaction.springidol.Vocalist">

<property  name="song"  value="Somewhere  Over  the  Rainbow"  />

</bean>

<bean id="stevie"

class="com.springinaction.springidol.Instrumentalist">

<property name="instrument" ref="guitar" />

<property  name="song"  value="Somewhere  Over  the  Rainbow"  />

</bean>

Как и прежде, эти два компонента совместно используют некото- рую общую конфигурацию. Определенно, они оба имеют одно и то же значение атрибута song. Но не похожи на объявления в преды- дущем разделе – эти два компонента относятся к разным классам. Поэтому для них нельзя создать общий родительский компонент. Или можно?

В языке Java классы-потомки наследуют общий базовый тип, который определен их родительским компонентом. Это означает, что в Java нет способа для класса потомка расширить общий тип и унаследовать при этом свойства и/или методы, но не унаследовать класс общего родителя. Однако в Spring подкомпонент не обязан наследовать тип общего родителя.

Два компонента с совершенно разными значениями атрибута class все еще могут иметь общие настройки свойств, унаследован- ные от родительского компонента.

Рассмотрим следующее объявление родительского абстрактного компонента:

<bean   id="basePerformer"   abstract="true">

<property  name="song"  value="Somewhere  Over  the  Rainbow"  />

</bean>

Компонент basePerformer объявляет общее свойство song, которое унаследуют два наших исполнителя. Но обратите внимание на от- сутствие в нем атрибута class. Это нормально, потому что каждый компонент-потомок будет определять свой тип в собственном атри- буте class. Ниже приводится новое определение компонентов taylor и  stevie:

<bean id="taylor"

class="com.springinaction.springidol.Vocalist" parent="basePerformer" />

<bean id="stevie"

class="com.springinaction.springidol.Instrumentalist" parent="basePerformer">

<property name="instrument" ref="guitar" />

</bean>

Обратите внимание, что наряду с другими атрибутами оба ком- понента используют атрибуты class и parent. Это обеспечивает воз- можность для двух и более отличных друг от друга компонентов наследовать свойства общего базового компонента. Как показа- но на рис. 3.4, значение свойства song наследуется из компонента basePerformer, даже если каждый наследник имеет совершенно иной, неродственный тип.

Рис. 3.4. Родительские компоненты не имеют определенного типа. Они могут использоваться только для хранения общей конфигурации, наследуемой компонентами других типов

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

А пока продолжим копаться в ящике, чтобы посмотреть, какие еще полезные инструменты можно найти. Мы уже познакомились с при- емом внедрения через конструкторы и методы доступа в главе 2. Те- перь посмотрим, как Spring обеспечивает другие способы внедрения, позволяющие декларативно вводить методы в компоненты, фактиче- ски изменяя их функциональные возможности, без необходимости менять лежащий в их основе программный код на языке Java.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии