4

目前我有一个包含许多数据存储服务的实用程序 jar。在幕后,这些数据存储服务使用 Spring Data MongoDB,并且一切都使用实用程序 jar 中的 app-context.xml 文件进行配置。我希望此实用程序 jar 能够更改后备存储,而无需更改使用此实用程序 jar 的任何内容。

现在,我想创建一个使用此实用程序 jar 中的数据存储服务的 spring mvc Web 应用程序。

如何进行设置,以便 spring mvc web 应用程序(或任何其他 jar)可以轻松使用数据存储服务,而不必对实用程序 jar 了解太多,但仍然正确加载实用程序 jar 中的 bean?

我正在考虑向实用程序 jar 添加一个新的 java bean 类,它将应用程序上下文加载到它自己的 jar 中,然后为服务设置一些属性。然后 spring mvc 将在我的实用程序 jar 中使用这个新类创建一个 bean,并通过这个 bean 引用服务。

/**
* This bean would exist in the utility jar, and other jars/webapps would
* create a new instance of this bean.
*/
public class Services {

    private MyAService myAService;
    private MyBService myBService;

    public Services() {
       ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("app-context.xml");

       // these are configured in the app-context.xml
       this.myAService = ctx.getBean("myAService");
       this.myBService = ctx.getBean("myBService");
    }
}

这是解决这个问题的好方法吗?好像我现在有两个 spring 应用程序上下文,可以吗?如何确保加载了正确的 app-context.xml,而不是来自另一个 jar 的?有没有更好的方法来做到这一点?

4

2 回答 2

4

由于没有人回答,我只是采用了我的方法,它似乎有效,尽管稍作修改以允许 bean 正确破坏内部上下文。

在您的实用程序 jar 中创建一个加载应用程序上下文 xml 的类,如下所示:

public class Services implements DisposableBean {

    ClassPathXmlApplicationContext ctx;
    private MyAService myAService;
    private MyBService myBService;

    public Services() {
       this.ctx = new ClassPathXmlApplicationContext("services-context.xml");

       // these are configured in the services-context.xml
       this.myAService = ctx.getBean("myAService");
       this.myBService = ctx.getBean("myBService");
    }

    // Add getters for your services

    @Override
    public void destroy() throws Exception {
       this.myAService = null;
       this.myBService = null;
       this.ctx.destroy();
       this.ctx = null;
    }
}

确保您的“services-context.xml”文件在类路径中是唯一的。您可以通过将其放在与包结构匹配的文件夹结构中来做到这一点。

在您的其他 jar/war 中,使用以下内容创建 beaning:

<bean id="services" class="Services" destroy-method="destroy"/>

或者,如果您的其他 jar/war 不使用 spring,那么您可以执行以下操作:

Services s = new Services();
//... use your services, then clean up when done
s.myAService.doSomething();
s.destroy();
于 2013-07-04T15:02:48.053 回答
0

有两种方法可以解决这个问题:(请在 pom.xml 中包含依赖项)

  1. 手动将所需的实用程序 bean 包含到这个新的 application-context.xml 中,路径引用那些类路径。这就是春天的美丽,只创造选择性的豆子。

  2. 有一个属性文件(将其包含在新的 application-context.xml 中)

<context:property-placeholder location="WEB-INF/utility.properties"/>

<import resource="${application.path.of.utility.jar}"/>

并定义实用程序jar的路径

application.path.of.utility.jar=/utility/jar/path/application_context.xml
于 2013-06-29T11:36:59.610 回答