Каково точное значение объема 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 (конечно, есть некоторые архитектуры распределенной среды где бы вы могли иметь больше экземпляра контейнера МОК, но я считаю, что это не ваш случай)