Вообще, да, Спринг порой очень не гибок и не продуман в некоторых местах. Я вот как-то хотел создать контроллер из конфигурации (а не авто-сканом). Причем, конечно же, я хотел, чтобы бин контроллера не создавался, если конфигурация не применилась из-за какого-либо кондишина.
Но практически единственный способ создать контроллер - это пометить его аннотацией
@Controller (или любой другой аннотацией, которая сама помечена аннотацией
@Controller). Но как только я это делаю - класс становится компонентом и находится через компнонет-скан, становясь бином.
Я тогда решил проблему, кажется, заглянув в исходники спринга и заметив, что его резолвер хттп-методов реагирует не только на аннотацию
@Controller, но и на аннотацию
@RequestMethod (которая бин не создает, к счастью). Т.е.
@RequestMethod является маркер-аннотацией для резолвера. И если пометить этой аннотацией любой класс, то тогда можно создать бин через конфигурацию, и он все еще будет "контроллером" (резолвер найдет его методы).
Но это скорее хак, чем фича. Повезло, что данная аннотация тоже "котируется" спрингом. Если бы не это, то пришлось бы либо пакет с контроллером в блек-лист для автоскана добавлять, либо свой дополнительный резолвер делать..
А вот с
@Repositoty, похоже, повезло меньше. Аналога этой аннотации, но не помеченной
@Component-ом - из коробки нет. Хотя, вы наверное можете создать свою собственную аннотацию, пометить ею свой класс-репозиторий, и кроме этого создать бин PersistenceExceptionTranslationPostProcessor, только вызвать на нем метод setRepositoryAnnotationType(ваша-новая-аннотация.class) - мне кажется должно работать.