Главная » Spring » Внедрение  зависимостей в конфигурации на языке Java

0

Если объявление компонента в конфигурации на языке Java – не более чем метод, возвращающий экземпляр класса, тогда как в этом случае реализовать внедрение зависимостей? Фактически, если сле- довать идиомам программирования на языке Java, внедрение реали- зуется очень просто.

Рассмотрим сначала, как реализовать внедрение значений в ком- понент. Ранее было показано, как с помощью элемента <constructor- arg> в конфигурации в формате XML создать жонглера (компонент типа Juggler), жонглирующего 15 мячиками. В конфигурации на языке Java достаточно просто передать требуемое число конструк- тору:

@Bean

public Performer duke15() { return  new  Juggler(15);

}

Как видите, конфигурация на языке Java выглядит вполне естест- венно и позволяет определять компоненты любыми доступными способами. Внедрение через метод записи на языке Java выглядит не менее естественно:

@Bean

public  Performer  kenny()  {

Instrumentalist  kenny  =  new  Instrumentalist(); kenny.setSong("Jingle   Bells");

return  kenny;

}

Внедрение простых значений реализуется очень просто. А как об- стоит дело со ссылками на другие компоненты? Все так же просто.

Для иллюстрации сначала объявим компонент sonnet29:

@Bean

private  Poem  sonnet29()  { return  new  Sonnet29();

}

Это объявление еще одного простого компонента на языке Java, мало чем отличающееся от объявления компонента duke. Теперь создадим компонент типа PoeticJuggler и внедрим в него компонент sonnet29 через конструктор:

@Bean

public  Performer  poeticDuke()  {

return  new  PoeticJuggler(sonnet29());

}

Внедрение другого компонента заключается в использовании ссылки на метод определения внедряемого компонента. Но эта прос- тота кажущаяся. В действительности все немного сложнее.

В конфигурации Spring на языке Java ссылка на компонент через метод с его объявлением – это не то же самое, что вызов метода. Если бы это было так, то всякий раз, вызывая метод sonnet29(), мы получали бы новый экземпляр компонента. Фреймворк Spring дей- ствует немного тоньше.

Пометив метод sonnet29() аннотацией @Bean, мы сообщаем фрейм- ворку, что этот метод определяет компонент для регистрации в кон- тексте приложения. Поэтому при каждом обращении к этому методу внутри другого метода объявления компонента Spring будет пере- хватывать вызов метода и пытаться отыскать компонент в контексте приложения, не позволяя этому методу создать новый экземпляр.

В заключение

За годы своего существования фреймворк Spring не раз подвер- гался критике за слишком обширное использование формата XML. Несмотря на значительные успехи Spring в направлении упрощения разработки корпоративных приложений на языке Java, многие раз- работчики предпочитают не видеть все эти угловые скобки.

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

<property> и <constructor-arg>. Благодаря элементу <context:component- scan> можно обеспечить автоматическую настройку всех компонен- тов. Мы также увидели, как полную конфигурацию приложения на основе Spring можно реализовать на языке Java, полностью изба- вившись от XML.

К настоящему моменту мы познакомились с несколькими спосо- бами объявления компонентов и внедрения их зависимостей. В сле- дующей главе будет рассматриваться поддержка в Spring аспектно- ориентированного программирования и ее использование для до- бавления в компоненты новых функциональных возможностей, хотя и важных для работы приложения, но не являющихся основными для самих компонентов.

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

По теме:

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