Создаётся ли один экземпляр бина @Component, если он внедряется через @Autowired в несколько других бинов?

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

Ответ

Да, по умолчанию создаётся один экземпляр (singleton). Все поля, аннотированные @Autowired и ссылающиеся на бин с @Component, получат ссылку на один и тот же объект в контексте Spring.

Пример:

@Component // Spring создаст ОДИН экземпляр этого класса
public class CommonService {
    // ...
}

@Service
public class OrderService {
    @Autowired // Ссылка на единственный экземпляр CommonService
    private CommonService commonService;
}

@Controller
public class UserController {
    @Autowired // Ссылка на тот же самый экземпляр CommonService
    private CommonService commonService;
}

Области видимости (Scope) бинов: Поведение по умолчанию можно изменить с помощью аннотации @Scope:

  • @Scope("singleton") (по умолчанию): Один бин на IoC-контейнер.
  • @Scope("prototype"): Новый экземпляр при каждом запросе (через getBean() или инъекцию).
  • @Scope("request"), @Scope("session"): Бин привязан к жизненному циклу HTTP-запроса или сессии (в веб-приложениях).

Почему singleton по умолчанию? Это обеспечивает эффективное использование памяти, отсутствие накладных расходов на создание объектов и безопасность в многопоточном окружении, если бин является stateless.