Может ли в Spring быть несколько экземпляров одного бина?

«Может ли в Spring быть несколько экземпляров одного бина?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, может, но это зависит от scope (области видимости) бина.

По умолчанию бин имеет scope singleton — создается один экземпляр на весь контейнер Spring.

Для создания нескольких экземпляров используются другие scopes:

  1. prototype: Каждый запрос бина через ApplicationContext.getBean() или инъекцию создает новый объект.

    @Component
    @Scope("prototype")
    public class PrototypeBean { /* ... */ }
  2. request, session, application (в веб-приложениях): Новый экземпляр создается для каждого HTTP-запроса, сессии или ServletContext соответственно.

Практический пример получения нескольких экземпляров prototype-бина:

@Service
public class MyService {
    // Использование ObjectFactory или Provider для ленивого получения новых экземпляров
    @Autowired
    private ObjectFactory<PrototypeBean> prototypeBeanFactory;

    public void process() {
        PrototypeBean bean1 = prototypeBeanFactory.getObject();
        PrototypeBean bean2 = prototypeBeanFactory.getObject();
        // bean1 != bean2
    }
}

Важно: Управление жизненным циклом prototype-бинов (например, вызов методов уничтожения) полностью ложится на клиентский код.