我有以下 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.dbController
和 AnotherService.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/