java - Jersey Restful : Spring bean creation management

标签 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类作为公共(public)静态变量并在所有使用 dbController 的类中引用它?这里的最佳实践是什么?

最佳答案

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

此外,使用任何依赖注入(inject)/控制反转框架的全部目的是管理“bean”的生命周期和相互依赖关系。 DI/IoC 库和框架可以避免这种静态/依赖噩梦,并帮助您构建可测试、可扩展的应用程序。

This part of the Spring reference documentation应该让事情变得更清楚。默认情况下,Spring 会为您创建和管理单例 bean(一个实例由应用程序中的所有组件共享)。查看beans scopes documentation .

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

如果您正在寻找最佳实践,the Jersey+Spring example should help you .

关于java - Jersey Restful : Spring bean creation management,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20252469/

相关文章:

java - 未处理的异常类型 ParseException - Parse.com 示例实现

java - 如何关闭 p :password? 的重新显示

java - 如何消费物联网设备产生的数据?

java - 数组索引越界(埃拉托斯特尼筛法)

java - Spring 和 Angular2 400(错误请求)

java - 为 Spring Boot 应用程序构建了两个 JAR

java - 如何在 Spring MVC 中解码 Gzip 压缩请求体

java - REST 上的身份验证 token

java - Eclipse:仅 "Run As > Run On Server"调用 web.xml

java - 如何打开 .hprof 文件