Jersey RESTful:Spring bean创建管理

时间:2013-11-27 20:26:15

标签: java spring rest dependency-injection jersey

我有以下Jersey RESTful Web服务类来提供HTTP请求/响应:

@Path("/customer")
public class CustomerService {

    private static ApplicationContext context;
    public static CustomerJDBCTemplate dbController;

    static {
        context = new ClassPathXmlApplicationContext("beans.xml");
        dbController = (CustomerJDBCTemplate) context.getBean("customerJDBCTemplate");
    }

        //methods for GET/POST requests ...
}

这里我使用静态变量dbController作为我的DAO对象。由于我希望在我的应用程序中只有一个dbController实例,因此我给它一个静态属性,以便所有Jersey类可以共享相同的dbController实例。因此,例如,如果我有另一个使用DAO的Jersey类,那么我可以将它用作CustomerService.dbController.create()之类的东西。但我想知道这是否是在Jersey类中实例化DAO bean的正确和最合适的方法,因为如果未调用Path:/ customer中的资源,则不会实例化DAO bean。

我还可以在另一个Jersey类中重复上面的bean实例化步骤:

@Path("/another")
public class AnotherService {

    private static ApplicationContext context;
    public static  CustomerJDBCTemplate dbController;

    static {
        context = new ClassPathXmlApplicationContext("beans.xml");
        dbController = (CustomerJDBCTemplate) context.getBean("customerJDBCTemplate");
    }

        //methods for GET/POST requests ...
}

我的问题是:这会创建一个与第一个不同的实例吗?或CustomerService.dbControllerAnotherService.dbController是否指向同一个对象?

如果我想在非Jersey类(例如服务层类)中使用第一个DAO对象CustomerService.dbController,我是否应该使用第一种方法仅在一个Jersey类中创建bean作为公共静态变量并在使用dbController的所有类中引用它?这里的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

最佳做法是使用@ 注入而不是静态。 泽西有自己的注射机制

public class MyApplication extends ResourceConfig {
public MyApplication() {
    register(new FacadeBinder());

注册为Singleton

public class FacadeBinder extends AbstractBinder {

  @Override
  protected void configure() {
    bind(MyManager.class).to(MyManager.class);
  }
}

然后在您的资源端点中,您可以使用已注册的类:

@Path("/jersey")
public class MyEndpoint implements MyInterface {
  @Inject
  MyManager myManager;

或者您可以与其他一些注入框架集成,例如Guice或Spring。

答案 1 :(得分:1)

首先,如果你打算使用Jersey + Spring,我认为jersey-spring集成是worth checking out

此外,使用任何依赖注入/控制反转框架的重点是管理“bean”的生命周期和相互依赖性。 DI / IoC库和框架在这里避免了这种静态/依赖性的恶梦,并帮助您构建可测试的,可扩展的应用程序。

This part of the Spring reference documentation应该让事情更清楚。通过默认,Spring为您创建和管理单例bean(一个实例在您的应用程序中共享)。查看beans scopes documentation

一般经验法则:直接注入/使用应用程序上下文有点代码味道(特别是如果你硬编码上下文文件的名称!)。

如果您正在寻找最佳做法,the Jersey+Spring example should help you