【问题标题】:Use spring application as library in non-spring application在非弹簧应用程序中使用弹簧应用程序作为库
【发布时间】:2015-06-17 20:23:10
【问题描述】:

我实现了 spring-boot 应用程序,现在我想将它用作非 spring 应用程序的库。 如何初始化 lib 类以使自动装配的依赖项按预期工作?显然,如果我使用“新”创建类实例,所有自动装配的依赖项都将为空。

【问题讨论】:

  • 没有简单或明显的方法可以做到这一点。我什至不确定这样做是否有意义。
  • 如果您正确地设计了您的应用程序(即不使用字段注入或其他任何需要 Spring 魔法运行的东西),您应该能够以编程方式手动实例化和连接所有组件。但是,看起来更好的解决方案是将您要共享的部分提取到一个完全不依赖于 Spring 的适当库中。
  • 我的应用程序设计“正确”:我没有使用字段注入。它主要使用构造函数注入,在某些情况下(可选参数)设置器注入。但这无济于事,因为组件依赖项是按链进行的。例如,我有带有构造函数参数 Class1 的入口点类。 Class1 具有构造函数参数 Class2。 Class2 具有构造函数参数 Class3 等。在实例化时,我将有类似的内容: new EntryPointClass(new Class1(new Class2(new Class3(...)))) 因此,手动实例化就像用 Java 编写所有 Spring 配置 I有:)
  • @AramAslanyan 也想做同样的事情,如果你能做到,请分享它对社区有很大帮助
  • 我不知道您如何将应用程序用作。这对我来说毫无意义。您将需要更详细地解释您想用至少一些 SSCCE 的外观来做什么。例如,如果您想在另一个应用程序中运行应用程序服务器,则需要考虑端口冲突和共享资源。

标签: spring dependency-injection spring-boot


【解决方案1】:

理论上,你需要为你的 Spring Boot 依赖实例化一个应用程序上下文,然后从那里提取一个 bean 并使用它。

实际上,在您的 Spring Boot 依赖项中,您应该有一个 Application.java 类或类似的类,其中一个 main 方法启动应用程序。首先添加一个这样的方法:

public static ApplicationContext initializeContext(final String[] args) {
    return SpringApplication.run(Application.class, args);
}

下一步,在您的主应用程序中,当您认为合适时(我会说是在启动期间,但也可能是您第一次需要使用您的依赖项),您需要运行此代码:

final String[] args = new String[0]; // configure the Spring Boot app as needed
final ApplicationContext context = Application.initializeContext(args); // createSpring application context
final YourBean yourBean = (YourBean)context.getBean("yourBean"); // get a reference of your bean from the application context

从这里您可以随意使用您的 bean。

【讨论】:

    【解决方案2】:

    我不确定在尝试从构造函数等访问某些 bean 之前,您将如何处理等到上下文完全加载。但如果您只想访问上下文而不手动创建组件,请尝试以下方法之一:

    1) 简单地注入 ApplicationContext

    @Inject
    private ApplicationContext context;
    

    2) 实现 ApplicationContextAware

    public class ApplicationContext implements ApplicationContextAware {
      private ApplicationContext context;
    
      @Override
      public void setApplicationContext(ApplicationContext context) {
          this.context = context;
      }
    
      // just quick example, better to set it to your custom singleton class
      public static ApplicationContext getContext() {
        return context;
      }
    }
    

    然后使用context.getBean(SomeServiceFromLibrary.class);

    【讨论】:

      猜你喜欢
      • 2022-07-21
      • 2021-07-30
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      相关资源
      最近更新 更多