【问题标题】:Run spring boot without @SpringBootApplication annotation as jar library in another project在另一个项目中将没有@SpringBootApplication注释的spring boot作为jar库运行
【发布时间】:2021-02-23 23:50:16
【问题描述】:

我正在尝试在 Spring Boot 项目中使用 @autowired 注释,该项目不是由带有 @SpringBootApplication 注释的 main 方法启动的。相反,我确实创建了该 spring 项目的 jar,并且我将该 jar 用作遗留项目(非 spring 项目)中的外部 jar。 结果,当您从 main 方法运行应用程序时,我无法获取 ApplicationContext 并且所有由 spring 管理的 bean 都是空的。

是否可以将Spring boot项目用作.jar而不使用run main方法??

public class RetrieveSubscriberType {
    public RetrieveSubscriberType() {
        ApplicationContext appCtx = ApplicationContextUtils
                .getApplicationContext();
        
        this.subscriber = (SubscriberDAOImpl)appCtx.getBean("subscriber");
    }

appCtx 始终为空

@Configuration
public class ApplicationContextUtils implements ApplicationContextAware {   
    private static ApplicationContext ctx;

      @Override
      public void setApplicationContext(ApplicationContext appContext)
          throws BeansException {
        ctx = appContext;

      }

      public static ApplicationContext getApplicationContext() {
        return ctx;
      }
}

ApplicationContextUtils 方法 setApplicationContext 没有被调用

【问题讨论】:

  • @Autowired 注释是 Spring 框架的一部分,而不是 SpringBoot(如您所知,它使用它) - 在旧版应用程序中使用它应该没有问题。见tutorialspoint.com/spring/spring_autowired_annotation.htm
  • 好的,但是我没有 Beans.xml 文件和我的 @Configuration 注释类,没有被调用,因为我没有从 main 方法运行它。只是一个罐子,我尝试用自动装配的属性实例化一个类
  • 没有细节,我猜你必须做什么。你的问题是:有可能吗?答案(和链接)表明是的,是的。 @Configuration 注解需要注册到上下文中,见docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
  • 请添加一个示例,说明您如何尝试在旧版应用程序中获取ApplicationContext
  • @Aivaras 我不想在旧版中获取 ApplicatioContext。但实际上在spring项目中。

标签: java spring spring-boot


【解决方案1】:

来自提供的docs

您可能需要通过 AnnotationConfigApplicationContext 引导您的 @Configuration

@Configuration 类通常使用AnnotationConfigApplicationContext 或其支持网络的变体AnnotationConfigWebApplicationContext 引导。

前者的简单示例如下:

 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
 ctx.register(AppConfig.class);
 ctx.refresh();
 MyBean myBean = ctx.getBean(MyBean.class);
 // use myBean ...

【讨论】:

  • @user353089 很高兴我能帮上忙 :) - 不,我不是天才,只是擅长阅读文档 ;)
猜你喜欢
  • 1970-01-01
  • 2021-07-23
  • 2017-06-03
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2018-11-07
  • 2019-08-02
相关资源
最近更新 更多