Экземпляр какого класса создается при инстанцировании обычного Spring-компонента?

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

Ответ

Spring создает прокси-объект, а не экземпляр исходного класса. Тип прокси зависит от конфигурации компонента:

  1. CGLIB-прокси (по умолчанию): Создается подкласс исходного класса.

    @Component
    public class MyService { /* ... */ }
    // При вызове getBean("myService") вернется объект типа:
    // class MyService$$EnhancerBySpringCGLIB$$...
  2. JDK Dynamic Proxy: Если компонент реализует хотя бы один интерфейс и настроено проксирование через интерфейсы (proxyMode = ScopedProxyMode.INTERFACES).

    @Component
    public class MyServiceImpl implements MyService { /* ... */ }
    // Будет возвращен прокси типа: com.sun.proxy.$ProxyXX

Почему так? Проксирование необходимо для прозрачного добавления сквозной функциональности (AOP), такой как транзакции (@Transactional), кэширование (@Cacheable) или безопасность.