2016-09-06 2 views
1

Может ли Spring bean быть ссылкой на другой bean-компонент? Он не работает:Должен ли компонент Spring представлять собой уникальный объект?

<bean id="player1" class="some.package.Player" /> 
<bean id="player2" ref="player1" /> 

Если это возможно, полезно ли это? До сих пор я думал, что каждый bean должен представлять собой уникальный объект, но мне пришла в голову какая-то идея: что, если бы у меня был класс Singleton, называемый eg. Sun с помощью метода «public static sun getInstance()», и я бы сделал два компонента, являющихся одним и тем же объектом?

<bean id="sun1" class="some.package.Sun" factory-method="getInstance" /> 
<bean id="sun2" class="some.package.Sun" factory-method="getInstance" /> 
+0

related: http://stackoverflow.com/questions/2515367/static-factory-method-spring (не 100% дубликат) –

+0

Это называется сглаживание. проверьте http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/ и выполните поиск псевдонима – DwB

+0

связанных: [Является ли Spring по умолчанию единственной точкой или нет?] (http://stackoverflow.com/q/31629993/217324) –

ответ

2

Глядя ниже

<bean id="player1" class="some.package.Player" />

<bean id="player2" ref="player1" />

Я думаю, что вы хотите передать тот же боб с двумя или несколькими именами. Если да, то вы можете иметь запятую или идентификаторы в качестве (понятие псевдонима)

<bean id="player1, player2" class="some.package.Player" />

Теперь вы можете обратиться к компоненту либо player1 или player2.

Аналогично,

<bean id="sun1" class="some.package.Sun" factory-method="getInstance" /> <bean id="sun2" class="some.package.Sun" factory-method="getInstance" />

можно заменить

<bean id="sun1, sun2" class="some.package.Sun" factory-method="getInstance" />

и это позволяет передать один и тот же компонент с двумя различными идентификаторами.

И понять, когда альясинга полезно, цитируя https://vladmihalcea.com/why-i-like-spring-bean-aliasing/,

Bean сглаживание позволяет переопределить уже настроенные бобы и заменить их с другим определением объекта. Это самое большее полезно, когда определения компонентов наследуются от внешнего ресурса , который не контролируется нами.

+0

Не отвечает на вопрос: это правда: sun1.getInstance(). hashCode() == sun2.getInstance(). hashCode()?Я думаю, что это будет относиться к тому же объекту, что и шаблон дизайна singleton в Java, созданный на уровне загрузчика классов. – agilob

+0

@agilob Предполагая, что 'getInstance()' является одноэлементной реализацией, да hashCode будет такой же, и оба относятся к одному и тому же объекту. –

+0

Это должно быть то же самое, потому что класс является 'public static class' <- Я предполагаю, что реализация класса была бы, если бы автор предоставил ее. – agilob

0

Бобы, как правило, однотонные, поэтому они представляют один объект за контекст. Стандартный шаблон оформления singleton в java создает один объект для каждого загрузчика классов. Я думаю, что в вашем случае вы будете повторно создавать один объект дважды, один раз с Spring beans и один раз с выполнением исполняемого файла класса. Таким образом, оба солнца будут одинаковыми, если вы сравните их хэш-коды с помощью .getInstance().hashCode().

Смежные вопросы