Spring:
По умолчанию все компоненты Spring единичны.
По умолчанию все компоненты Spring единичны.
Обьявление в бине:
@Component
@Scope("prototype")
public class Primer {
.........
}
или так:
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)Начиная с версии 4.3 в web-приложении можно также использовать аннотации: @ApplicationScope@RequestScope@SessionScope
- singleton = В каждом контейнере Spring может быть создан только
один компонент (по умолчанию);
- prototype = Позволяет создавать произвольное количество
компонентов (по одному на каждое обращение)
- request = Область действия ограничивается HTTP-запросом. Применяется только в веб-приложениях Spring (Spring MVC);
- session = Область действия ограничивается HTTP-сеансом. Применяется только в веб-приложениях Spring (Spring MVC);
- global-session = Область действия ограничивается
глобальным HTTP-сеансом. Применяется только в портлетах;
Понятие единичных компонентов ограничено областью действия контекста Spring. В отличие от истинных классов-одиночек, гарантирующих существование единственного экземпляра на каждый загрузчик классов (classloader), для единичных компонентов в Spring гарантируется только наличие единственного экземпляра компонента в контексте приложения – ничто не мешает создать экземпляр того же класса традиционным способом или даже создать несколько объявлений бина для одного и того же класса.
Теперь для сравнения стек JavaEE:
JavaEE CDI:
@RequestScoped
@SessionScoped
@ApplicationScoped
@Dependent - по умолчанию - аналог "prototype" в Spring
@Singleton - В реализации CDI данного скоупа есть одна особенность: в процессе инъекции клиент получает ссылку на реальный объект созданный контейнером, а не proxy. В результате чего могут быть проблемы неоднозначности данных, если состояние синглтона будет меняться, а использующие его бины, например, были или будут сериализованы.
JavaEE EJB:
@Stateful - сохраняющие состояние бины;
@Stateless - не сохраняющие состояние бины;
@Singleton
И еще - по своей природе Request-бины потокобезопасны - отработал запрос и удалился.
Теперь для сравнения стек JavaEE:
JavaEE CDI:
@RequestScoped
@SessionScoped
@ApplicationScoped
@Dependent - по умолчанию - аналог "prototype" в Spring
@Singleton - В реализации CDI данного скоупа есть одна особенность: в процессе инъекции клиент получает ссылку на реальный объект созданный контейнером, а не proxy. В результате чего могут быть проблемы неоднозначности данных, если состояние синглтона будет меняться, а использующие его бины, например, были или будут сериализованы.
JavaEE EJB:
@Stateful - сохраняющие состояние бины;
@Stateless - не сохраняющие состояние бины;
@Singleton
И еще - по своей природе Request-бины потокобезопасны - отработал запрос и удалился.
Комментариев нет:
Отправить комментарий