Каково точное значение объема Spring Singleton?

Я определил два bean-компонента для одного и того же класса с разными именами идентификаторов в applicationContext.xml. Это работает отлично, поэтому я запутался в том, что означает точный объем синглтона. Мой код ниже. Я прошел через некоторые другие подобные вопросы в stackru. Но мне не ясно, потому что это не совсем тот же контекст и очень длинное объяснение.

Пожалуйста, поделитесь со мной, если вы знаете, что это такое

Я прочитал это
1. Один экземпляр для контейнера (контекст),
- В моем случае, это создает два контейнера для моих двух экземпляров?

<bean id="a2" class="com.myapp.Address">
    <constructor-arg value="Delhi"></constructor-arg>
    <constructor-arg value="DOWN"></constructor-arg>
    <constructor-arg value="India"></constructor-arg>
</bean>


<bean id="e" class="com.myapp.Employee">
    <constructor-arg value="12" type="int"></constructor-arg>
    <constructor-arg value="Sonoo"></constructor-arg>
    <constructor-arg>
        <ref bean="a1" />
    </constructor-arg>
</bean>

<bean id="e2" class="com.myapp.Employee">
    <constructor-arg value="12" type="int"></constructor-arg>
    <constructor-arg value="Sonoo"></constructor-arg>
    <constructor-arg>
        <ref bean="a2" />
    </constructor-arg>
</bean>

3 ответа

Бин Singleton Scoped является простым: каждый бин на самом деле является одним объектом, созданным в контейнере (он же контекст приложения).

В вашем примере Spring контейнер собирается создать 2 Employee объекты (он же бобы), который является e а также e1 соответственно.

Другие области немного сложнее. Для одного компонента может быть создано более 1 объекта. Например, если вы определили bean-компонент с областью действия прототипа, то всякий раз, когда вы будете искать этот bean-компонент из контейнера, контейнер будет создавать экземпляр нового объекта. Для другой области видимости это аналогично: контейнер собирается создать новую базу экземпляров в определенное время (например, область запроса будет вызывать создание компонента для каждого входящего запроса и т. Д.).


Обратите внимание: не путайте этот Singleton с шаблоном Singleton Design. У них нет ничего общего, кроме характеристики "Только один". Шаблон проектирования Singleton обладает множеством других характеристик (например, доступный по всему миру метод поиска; только один экземпляр во всем пространстве процесса; явное создание экземпляров и т. Д.), Который не имеет ничего общего с областью применения Springton Singleton.

  • Синглтон - это область по умолчанию весной, т. Е. Один экземпляр компонента (или объекта) на контейнер.
  • Не следует путать с The Gang of Four Singleton, у него один и только один экземпляр за ClassLoader,
  • В вашем контексте четко определены два компонента bean с адресами.

Spring singleton scope означает, что контейнер Spring создает один объект только для одного и того же класса для разных экземпляров.

Например, в вашем коде, если вы не вводите значения в объект e2 сотрудника и пытаетесь напечатать значения для e и e2 для обоих классов сотрудников, оба будут выдавать один и тот же результат.

(Если вы ссылаетесь на bean-компонент в том же XML-файле, который вы можете использовать <ref local=""/> вместо реф боба)

<bean id="e" class="com.myapp.Employee">
    <constructor-arg value="12" type="int"></constructor-arg>
    <constructor-arg value="Sonoo"></constructor-arg>
    <constructor-arg>
        <ref local="a1"/>
    </constructor-arg>
</bean>

<bean id="e2" class="com.myapp.Employee">
    <constructor-arg>
        <ref local ="a2" />
    </constructor-arg>
</bean>

В приведенном выше случае значения для сотрудника для e и e2 будут равны 12 и Sonoo соответственно.

Весенний одноэлементный охват работает почти так же, как одноэлементный программный паттерн ( http://en.wikipedia.org/wiki/Singleton_pattern), основная идея которого заключается в том, что у вас будет только ОДИН экземпляр каждого из ваши объявленные bean-компоненты в экземпляре IOC (контекст выполнения Spring); чтобы быть более кратким, каждый раз, когда вы ссылаетесь на a2, e или e2 в любом компоненте вашего кода, используя пружинное внедрение, у вас будет ТОЧКА ЖЕ, то есть один и тот же объект в той же ячейке памяти.

Я рекомендую вам взглянуть на это:

http://www.tutorialspoint.com/spring/spring_bean_scopes.htm а также некоторые рабочие примеры по адресу: http://www.mkyong.com/spring/spring-bean-scopes-examples/

И последнее, и экземпляр IOC отличается от экземпляра объекта, экземпляр контейнера похож на ваш основной метод, поэтому все выполняется внутри него, и вы создаете компоненты и делаете все внутри одного контейнера IOC (конечно, есть некоторые архитектуры распределенной среды где бы вы могли иметь больше экземпляра контейнера МОК, но я считаю, что это не ваш случай)

Другие вопросы по тегам