如何从外部实用程序jar正确加载和配置Spring bean

时间:2013-06-28 22:14:57

标签: java spring spring-data-mongodb

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

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

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

我正在考虑向实用程序jar添加一个新的java bean类,它将app-context加载到它自己的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");
    }
}

这是一个很好的方法吗?好像我现在有两个弹簧应用程序上下文,那可以吗?如何确保加载正确的app-context.xml,而不是另一个jar加载?有没有更好的方法呢?

2 个答案:

答案 0 :(得分: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”文件在类路径中是唯一的。您可以通过将其放在与包结构匹配的文件夹结构中来完成此操作。

在你的另一个罐子/战争中,使用类似的东西创建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();

答案 1 :(得分:0)

您可以通过两种方法解决此问题:(请将依赖项作为pom.xml的一部分包含在内)

  1. 要手动将所需的实用程序bean包含到此新的application-context.xml中,并使用指向这些类路径的路径。这只是创造选择性豆类的春天之美。

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

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

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

    并定义路径ao the utility jar

    application.path.of.utility.jar=/utility/jar/path/application_context.xml