Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在非spring应用程序中使用spring应用程序作为库_Spring_Dependency Injection_Spring Boot - Fatal编程技术网

在非spring应用程序中使用spring应用程序作为库

在非spring应用程序中使用spring应用程序作为库,spring,dependency-injection,spring-boot,Spring,Dependency Injection,Spring Boot,我实现了spring引导应用程序,现在我想将它用作非spring应用程序的库。 我如何初始化lib类以使自动连接的依赖项按预期工作?显然,如果我使用“new”创建类实例,所有自动连接的依赖项都将为空。理论是,您需要实例化一个应用程序上下文,以便Spring Boot依赖项能够生存,然后从中提取一个bean并加以利用 实际上,在Spring引导依赖项中,应该有一个Application.java类或类似的类,其中一个主方法启动应用程序。首先添加如下方法: public static Applica

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

理论是,您需要实例化一个应用程序上下文,以便Spring Boot依赖项能够生存,然后从中提取一个bean并加以利用

实际上,在Spring引导依赖项中,应该有一个
Application.java
类或类似的类,其中一个主方法启动应用程序。首先添加如下方法:

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。

我不确定您将如何处理,在尝试从构造函数等访问某些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)

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