Ответ 1
Одиночный масштаб
Когда bean является singleton
, будет управляться только один общий экземпляр bean, и все запросы для beans с идентификатором или идентификаторами, соответствующими этому определению bean, приведут к тому, что один специфический экземпляр bean, возвращаемый контейнером Spring.
Другими словами, когда вы определяете определение bean и оно определяется как singleton
, тогда Spring IoC container
будет create exactly one instance of the object
, определяемым этим определением bean. Этот единственный экземпляр будет храниться в кеше такого singleton beans, и все последующие запросы и ссылки для имени с именем bean приведут к возврату кэшированного объекта.
Область сеанса
С приведенным выше определением bean контейнер Spring создаст новый экземпляр bean для lifetime of a single HTTP Session
.
В соответствии с рамочной ссылкой Spring необходимо применять другой подход в случаях, когда класс, который "lives longer
" (singleton bean в этом случае), должен быть введен другим классом, имеющим сравнительно более короткий срок службы -span (с охватом сеанса bean). Однако этот подход отличается для прототипа и синглтонной области.
В вашем XML мы хотим, чтобы экземпляр singletonBean был создан только один раз, и ему нужно ввести sessionBean. Но так как sessionBean
является областью действия сеанса (что означает, что он должен быть повторно создан для каждого сеанса), конфигурация неоднозначна (поскольку зависимости устанавливаются во время создания экземпляра, а значение области сеанса связи также может измениться позже).
Итак, вместо того, чтобы вводить этот класс, он вводит прокси, который предоставляет тот же публичный интерфейс, что и sessionBean. Контейнер вставляет этот прокси-объект в singletonBean bean, который не знает, что эта ссылка sessionBean является прокси-сервером. Он указан путем записи этого тега в sessionBean:
<aop:scoped-proxy/>
Конфигурация XML:
<bean name="singletonBean" class="somepkg.SingletonBean">
<property name="someProperty" ref="sessionBean"/>
</bean>
<bean name="sessionBean" class="somepkg.SessionBean" scope="session">
<aop:scoped-proxy/>
</bean>
Когда экземпляр singletonBean
вызывает метод для объекта sessionBean, вложенного в зависимость, он фактически вызывает метод в прокси. Затем прокси-сервер извлекает реальный объект sessionBean из (в данном случае) сеанса HTTP и делегирует вызов метода на восстановленный реальный объект sessionBean.
Alse, пожалуйста, обратитесь к для получения дополнительной информации.
Синглтон beans с зависимостями prototype- bean
Инъекция метода поиска
Когда вы используете singleton-scoped
beans с зависимостями от prototype beans
, имейте в виду, что зависимости разрешаются во время создания экземпляра. Таким образом, если вы зависите-введете a prototype-scoped
bean в singleton-scoped bean, создается новый прототип bean, а затем вставляется в синглтон bean. Экземпляр прототипа - единственный экземпляр, который когда-либо передается в singleton-scoped bean.
Однако предположим, что вы хотите, чтобы
<!-- a stateful bean deployed as a prototype (non-singleton) -->
<bean id="command" class="fiona.apple.AsyncCommand" scope="prototype">
<!-- inject dependencies here as required -->
</bean>
<!-- commandProcessor uses statefulCommandHelper -->
<bean id="commandManager" class="fiona.apple.CommandManager">
<lookup-method name="createCommand" bean="command"/>
</bean>
Lookup method
Впрыск - это возможность контейнера override methods on container
управляемого beans, чтобы вернуть результат поиска для другого с именем bean в контейнере. lookup
обычно включает prototype bean
, как в сценарии, описанном в предыдущем разделе. Spring Framework реализует эту инъекцию метода, используя генерацию байтового кода из CGLIB library
для динамического создания подкласса, который переопределяет метод.
Обратитесь метод поиска метода поиска.
Следуйте для получения более подробного примера и информации.