在 Nurio Fernández 和 Andrei Kovrov 给予我的帮助后,我找到了完成我想做的事情的正确方法。
首先我将Spring集成到了api中,而不仅仅是进入了核心,将spring boot从核心移动到了api中,从而在api中产生了这个类。
Api - ApplicationInitializer.java
@Order(Ordered.HIGHEST_PRECEDENCE)
@SpringBootApplication(scanBasePackages = {"com.factelcore.*","uy.com.antel.fact.*"})
@EnableJpaRepositories("com.factelcore.repository")
public class ApplicationInitializer extends SpringBootServletInitializer {
public static void main(String[] args){
SpringApplication.run(ApplicationInitializer.class,args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(applicationClass);
}
private static Class<ApplicationInitializer> applicationClass = ApplicationInitializer.class;
}
通过这样做,我确保我在 api 中有一个 spring 上下文,我可以使用它。当我从这里启动 Spring 时,我会扫描所有 api 和 core 文件,对 bean 执行适当的配置。
完成此操作后,我需要捕获上下文以恢复核心中定义的 bean,因此我可以使用核心中定义的 @Service 类。为此,我创建了以下类:
Api - AppContextUtil.java
@Component
public class AppContextUtil implements ApplicationContextAware {
@Autowired
private WebApplicationContext context;
private static ApplicationContext appContext;
@PostConstruct
public void init() {
if (context != null) {
setApplicationContext(context);
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
AppContextUtil.appContext = applicationContext;
}
public static ApplicationContext getContext() {
return appContext;
}
}
完成后,使用 SolicitudApiServiceImpl 我可以执行以下操作来调用我在特定时间需要的 bean:
Api - SolicitudApiServiceImpl.java
ApplicationContext cont = AppContextUtil.getContext();
SolicitudInformacionService solInfServ = cont.getBean(SolicitudInformacionService.class);
我不知道这是否是执行此操作的理想方法,但就我而言,它对我有用,如果有人有更好的方法,请随时告诉我,以便我改进代码.非常感谢!