Я нашел решение.
ConfigurableApplicationContext context = SpringApplication.run(EventServiceApplication.class, args);
// Load class ...
context.start();
Если мы запустим метод context.start () после загрузки класса, то Spring создаст @Component, подобный bean-компоненту класса, и поместит его в контейнер Spring.
Другойрешение (Это точное решение):
ConfigurableApplicationContext context = SpringApplication.run(EventServiceApplication.class, args);
List<Class<?>> classes = // load classes
classes
.stream()
.filter(clazz -> clazz.isAnnotationPresent(Component.class) || Arrays.stream(clazz.getAnnotations()).anyMatch(annotation -> annotation.annotationType().isAnnotationPresent(Component.class)))
.forEach(applicationContext::register);
После регистрации классов, возможно, один из загруженных вами классов помечен @Configuration
и содержит @Bean
аннотированных методов.Для регистрации этих @Bean
методов.Вы должны использовать
ConfigurationClassPostProcessor configurationClassPostProcessor; // This class is autowireable. Spring has bean for this class at spring bean container.
configurationClassPostProcessor.processConfigBeanDefinitions(applicationContext.getDefaultListableBeanFactory())
Я нашел это решение в исходном коде Spring Framework