Я знаю, что это действительно старо, но я решил, что я брошу это на тот случай, если у кого-то еще будет такой же грубый опыт, как у меня, когда я пытался сделать эту работу.В итоге я воспользовался двумя функциями Spring: возможностью динамической регистрации bean-компонентов после запуска контекста и методом afterPropertiesSet()
объекта RequestMappingHandlerMapping
.
Когда инициализируется RequestMappingHandlerMapping
, он сканирует контекст и создает карту всех @RequestMapping
с, которые он должен обслуживать (предположительно из соображений производительности).Если вы динамически регистрируете компоненты, помеченные @Controller
, они не будут приняты.Чтобы повторно запустить это сканирование, вам просто нужно вызвать afterPropertiesSet()
после того, как вы добавили свои bean-компоненты.
В моем конкретном случае использования я создал новые объекты @Controller
в отдельном контексте Spring и должен был подключитьих в мой контекст WebMvc.Подробности того, как объекты не имеют значения для этого, все, что вам нужно, это ссылка на объект:
//register all @Controller beans from separateContext into webappContext
separateContext.getBeansWithAnnotation(Controller.class)
.forEach((k, v) -> webappContext.getBeanFactory().registerSingleton(k, v));
//find all RequestMappingHandlerMappings in webappContext and refresh them
webappContext.getBeansOfType(RequestMappingHandlerMapping.class)
.forEach((k, v) -> v.afterPropertiesSet());
Например, вы также можете сделать это:
//class annotated with @Controller
MyController controller = new MyController
//register new controller object
webappContext.getBeanFactory().registerSingleton("myController", controller);
//find all RequestMappingHandlerMappings in webappContext and refresh them
webappContext.getBeansOfType(RequestMappingHandlerMapping.class)
.forEach((k, v) -> v.afterPropertiesSet());