【问题标题】:how to create/load a custom spring jar in a not spring managed web application如何在非弹簧管理的 Web 应用程序中创建/加载自定义弹簧罐
【发布时间】:2014-12-13 06:03:14
【问题描述】:

我想使用 spring 创建一个 jar 库并将它们导入我的 Web 应用程序。由于我在后者中也使用了弹簧,所以我没有任何问题。关键是我也想在非弹簧管理环境中重新使用它。 假设我想在纯 javaee web 应用程序中使用 lib,那么我不能使用 spring 自动装配和包扫描功能。 我的想法是:创建一个简单的纯bean并在其构造函数中加载spring配置:

public class SpringStandalone{

private Client                      client;
private AnnotationConfigApplicationContext  ctx;

public SpringStandalone() {
    ctx = new AnnotationConfigApplicationContext();
    ctx.getEnvironment().setActiveProfiles("test");
    ctx.scan("my.package.scan");
    ctx.refresh();
    client = (Client) ctx.getBean(Client.class);
    ctx.destroy();
}

public void send(Object o) {
    client.send(o);
}

}

这是正确的方法吗?如果是这样,我应该如何管理 applicationContext 销毁(我应该为此烦恼吗?)?

提前感谢您的帮助。

法比奥

【问题讨论】:

    标签: spring jar applicationcontext


    【解决方案1】:

    不能破坏 Spring 应用程序上下文并希望您的 Client 对象能够正常工作。
    相反,您应该提供一个单独的“SpringStandalone.destroy()”方法,当不再需要您的 SpringStandalone 类时,客户端代码将调用该方法。

    请注意,对 ctx.destroy() 的调用不仅会清除 Spring 容器,还会触发一些“业务”操作,例如调用所有带有 @PreDestroy,发布关闭事件等,因此当您不再需要 SpringStandalone 对象时调用它是一个好习惯。

    我相信你的方法没有错。
    请注意,加载 Spring 应用程序上下文需要时间,因此您可能只想创建一次 SpringStandalone。

    【讨论】:

    • 好吧,与此同时,我将 springStandalone 类更改为单例,以便仅获取一个实例(如您所建议的那样)。由于客户端必须与托管 Web 应用程序一样存在,所以我猜销毁操作与应用程序关闭匹配。我对吗?无论如何感谢您的回答。
    • 是的,如果客户端 bean 应该与应用程序一样长,那么销毁操作应该与应用程序关闭相匹配。至于单例,在我看来它只是可能的解决方案之一,明显的缺点是这是一个具有所有缺陷的全局变量。另一个注意事项:您想在应用启动时检测 Spring 配置问题,但单例模式可能会将 SpringStandalone 创建推迟到第一次使用,因此我建议在应用启动时进行显式调用以触发创建。
    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2018-05-06
    相关资源
    最近更新 更多