我有以下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作为公共静态变量并在使用dbController
的所有类中引用它?这里的最佳做法是什么?
答案 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。