«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Области действия Spring Bean для синглтона и прототипа: подробное исследование

Области действия Spring Bean для синглтона и прототипа: подробное исследование

Опубликовано 6 ноября 2024 г.
Просматривать:554

Singleton and Prototype Spring Bean Scopes: A Detailed Exploration

Когда я впервые начал работать со Spring, одной из концепций, которая заинтриговала меня больше всего, была идея областей видимости компонентов. Spring предоставляет различные области bean-компонентов, которые определяют жизненный цикл bean-компонентов, созданных в контейнере Spring. Двумя наиболее часто используемыми областями действия являются Singleton и Prototype. Понимание этих областей имеет решающее значение для разработки эффективных и действенных приложений Spring, поэтому позвольте мне рассказать вам, что я о них узнал.

Понимание областей действия Spring Bean

В Spring компонент — это объект, экземпляр которого создается, собирается и управляется контейнером Spring IoC (инверсия управления). Область действия компонента относится к жизненному циклу компонента — как и когда создаются экземпляры компонента и как долго они существуют.

Spring предлагает несколько областей действия bean-компонентов, но я остановлюсь на двух:

  • Одноэлементная область действия
  • Объем прототипа

Каждая область действия имеет свои конкретные варианты использования, и выбор правильного может существенно повлиять на поведение и производительность вашего приложения.

Синглтон-область

Область действия Singleton — это область действия по умолчанию в Spring, и я использую ее чаще всего. Когда bean-компонент определен в области Singleton, это означает, что контейнер Spring создаст только один экземпляр этого bean-компонента, и этот единственный экземпляр будет использоваться во всем контексте приложения.

Как это работает

Когда я объявляю bean-компонент как Singleton, Spring создает экземпляр bean-компонента при первом запросе, либо во время запуска контекста приложения, либо при первом обращении к нему. После этого каждый последующий запрос этого компонента будет возвращать один и тот же экземпляр.

Вот простой пример:

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}

В этом примере myService() является компонентом Singleton. Каждый раз, когда я запрашиваю bean-компонент MyService из контекста Spring, я получаю один и тот же экземпляр.

Варианты использования Singleton Beans

Я обнаружил, что область действия Singleton идеально подходит для bean-компонентов без сохранения состояния — тех, которые не содержат никакой информации, специфичной для клиента. Примеры:

  • Классы обслуживания: Обычно эти классы содержат бизнес-логику, которую можно использовать во всем приложении без необходимости создания отдельных экземпляров.
  • Классы DAO: поскольку они обычно взаимодействуют с базой данных и не поддерживают состояние, специфичное для клиента, достаточно одного экземпляра.

Преимущества и соображения

Основным преимуществом компонентов Singleton является эффективность использования памяти. Повторное использование одного экземпляра позволяет приложению потреблять меньше памяти, а затраты на создание и уничтожение объектов сводятся к минимуму. Однако важно быть осторожным с компонентами Singleton, которые сохраняют состояние. Если компонент Singleton случайно сохраняет состояние (например, переменные экземпляра), это состояние может использоваться несколькими клиентами, что приводит к потенциальным несоответствиям данных.

Область применения прототипа

В отличие от Singleton, область действия Prototype создает новый экземпляр компонента каждый раз, когда компонент запрашивается из контейнера Spring. Когда я узнал об этом, стало ясно, что компоненты Prototype полезны в сценариях, где мне нужен новый экземпляр для каждого использования.

Как это работает

Когда компонент определен в области прототипа, Spring будет возвращать новый экземпляр каждый раз, когда запрашивается компонент. Вот как я мог бы определить компонент-прототип:

@Configuration
public class AppConfig {
    @Bean
    @Scope("prototype")
    public MyService myService() {
        return new MyService();
    }
}

В этом примере каждый раз, когда я запрашиваю bean-компонент MyService из контекста Spring, Spring создает новый экземпляр MyService.

Варианты использования прототипов Bean-компонентов

Прототипы bean-компонентов особенно полезны при работе с bean-компонентами с состоянием — теми, которые поддерживают какое-то состояние, специфичное для клиента, или требуют уникальной конфигурации для каждого использования. Некоторые типичные случаи использования включают:

  • Командные объекты: Если я реализую такой шаблон, как команда, где каждая команда выполняется отдельно и поддерживает свое собственное состояние, то компонент-прототип является правильным выбором.
  • Bean-компоненты с областью действия сеанса или запроса: в веб-приложениях bean-компоненты, специфичные для пользовательского сеанса или запроса, могут быть определены как прототипы, чтобы гарантировать создание нового экземпляра для каждого пользователя или запроса.

Преимущества и соображения

Основное преимущество использования bean-компонентов Prototype — это гибкость, которую он предлагает при создании новых экземпляров. Это особенно полезно при работе с объектами с состоянием. Однако существует компромисс с точки зрения производительности и использования ресурсов. Поскольку каждый раз создается новый экземпляр, это может привести к более высокому потреблению памяти и более частой сборке мусора. Более того, в отличие от bean-компонентов Singleton, Spring не управляет жизненным циклом bean-компонентов Prototype за пределами создания, поэтому мне приходится вручную выполнять уничтожение и очистку этих bean-компонентов.

Синглтон против прототипа: выбор правильной области применения

Одним из ключевых решений, с которыми я сталкиваюсь при разработке приложения Spring, является выбор между областью действия Singleton и Prototype. Вот краткое изложение факторов, которые я учитываю:

  • Сохранение состояния: если компонент не имеет состояния, лучшим выбором обычно является Singleton. Для bean-компонентов с состоянием более подходящим является Prototype.
  • Управление ресурсами: одноэлементные компоненты более эффективно используют память, поскольку поддерживается только один экземпляр. Компоненты-прототипы, предлагая большую гибкость, потребляют больше ресурсов.
  • Управление жизненным циклом: бины Singleton управляются контейнером Spring на протяжении всего их жизненного цикла. Напротив, я должен управлять полным жизненным циклом компонентов-прототипов.

Практический пример

Позвольте мне представить практический сценарий, который может помочь прояснить, когда использовать каждую область действия. Предположим, я создаю приложение для онлайн-покупок.

  • Служба корзины покупок: эта служба обычно не имеет состояния и может быть хорошим кандидатом на компонент Singleton. Нет необходимости каждый раз создавать новый экземпляр, и один и тот же сервис может обрабатывать несколько запросов.
  • Обработка заказов: С другой стороны, объект Order, представляющий заказ клиента, будет иметь состояние и содержать сведения, специфичные для этого заказа. Следовательно, это должен быть компонент-прототип, чтобы каждый заказ обрабатывался отдельным экземпляром класса Order.

Смешение областей применения: слово предостережения

Одна вещь, которую я усвоил на собственном горьком опыте, заключается в том, что смешивание компонентов Singleton и Prototype может привести к неожиданным проблемам. Например, внедрение bean-компонента в области Prototype в bean-компонент Singleton может привести к тому, что bean-компонент Singleton всегда будет использовать один и тот же экземпляр bean-компонента Prototype. Чтобы избежать этого, я обычно внедряю Provider или использую аннотацию @Lookup, чтобы гарантировать создание нового экземпляра bean-компонента Prototype каждый раз, когда это необходимо.

@Service
public class SingletonService {

    @Autowired
    private Provider myPrototypeServiceProvider;

    public void usePrototypeService() {
        MyPrototypeService prototypeService = myPrototypeServiceProvider.get();
        prototypeService.execute();
    }
}

В этом примере myPrototypeServiceProvider.get() гарантирует, что новый экземпляр MyPrototypeService создается каждый раз, когда он вызывается внутри компонента Singleton.

До свидания !

Понимание нюансов областей действия компонентов Singleton и Prototype в Spring имело решающее значение на моем пути как разработчика. Обе области предлагают явные преимущества в зависимости от варианта использования, и выбор правильной может существенно повлиять на производительность и дизайн приложения.

По моему опыту, Singleton является подходящей областью применения для большинства компонентов из-за его эффективности и простоты, тогда как Prototype зарезервирован для тех особых случаев, когда мне каждый раз нужен новый экземпляр. Тщательно учитывая состояние моих bean-компонентов и то, как они используются в приложении, я могу принимать обоснованные решения, которые приводят к созданию более качественных и удобных в сопровождении приложений Spring.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/isaactony/singleton-and-prototype-spring-bean-scopes-a-detailed-exploration-1gpl?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected] удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3