Ответ
Spring создает прокси-объект, а не экземпляр исходного класса. Тип прокси зависит от конфигурации компонента:
-
CGLIB-прокси (по умолчанию): Создается подкласс исходного класса.
@Component public class MyService { /* ... */ } // При вызове getBean("myService") вернется объект типа: // class MyService$$EnhancerBySpringCGLIB$$... -
JDK Dynamic Proxy: Если компонент реализует хотя бы один интерфейс и настроено проксирование через интерфейсы (
proxyMode = ScopedProxyMode.INTERFACES).@Component public class MyServiceImpl implements MyService { /* ... */ } // Будет возвращен прокси типа: com.sun.proxy.$ProxyXX
Почему так? Проксирование необходимо для прозрачного добавления сквозной функциональности (AOP), такой как транзакции (@Transactional), кэширование (@Cacheable) или безопасность.