Изменить на (интерфейс вместо конкретного класса):
@Resource(name="userService")
private UserDetailsService userService;
И жить долго и счастливо.
Длинная версия: во время выполнения по умолчанию Spring заменяет ваш класс на нечто , которое реализует все интерфейсы вашего класса.Если вы вводите интерфейс, а не конкретный тип, вам все равно, какой именно тип реализует этот интерфейс.
В вашем случае добавление аннотации @Transactional
приводит к замене вашего компонента на прокси-сервер AOP с возможностями транзакций,Если вы удалите эту аннотацию, ваш код будет работать нормально.Однако полезно полагаться на интерфейсы, а не на конкретные реализации.