Java Jersey RESTful:Spring bean创建管理

Java Jersey RESTful:Spring bean创建管理,java,spring,rest,dependency-injection,jersey,Java,Spring,Rest,Dependency Injection,Jersey,我有以下RESTful web服务类来服务HTTP请求/响应: @Path("/customer") public class CustomerService { private static ApplicationContext context; public static CustomerJDBCTemplate dbController; static { context = new ClassPathXmlApplicationContext(

我有以下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
实例。例如,如果我有另一个Jersey类使用DAO,那么我可以将其用作
CustomerService.dbController.create()
之类的东西。但我想知道这是否是在Jersey类中实例化DAOBean的正确且最合适的方法,因为如果未调用Path:/customer处的资源,则不会实例化DAOBean

我还可以在另一个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
另一个服务.dbController
是指同一个对象吗


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

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

public class MyApplication extends ResourceConfig {
public MyApplication() {
    register(new FacadeBinder());
登记为单身人士

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)集成。

首先,如果您计划使用Jersey+Spring,我认为Jersey-Spring集成是可行的

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

应该让事情更清楚。默认情况下,Spring为您创建和管理单例bean(应用程序中的所有人共享一个实例)。看看这本书

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


如果您正在寻找最佳实践,.

谢谢。在我的示例中,
dbController
是通过Springbean配置文件注入的。我之所以将其设置为静态,是因为我想在另一个类中重用相同的
dbController
bean,这样这个daobean在我的应用程序中只有一个实例。如果我使用
@Inject
注释,它将等同于我的springbean注入。那么区别是什么呢?区别在于类中的静态代码。例如,如果您编写一个单元测试,您将需要初始化Spring上下文,这样才能工作,这相当耗时。另一件重要的事情是代码中的字符串文本。他们在更大的项目上很容易出错。谢谢你的评论和泽西之春指南的链接。我通读了链接中的示例代码。我没有找到任何使用应用程序上下文
getBean()
方法的bean实例化。那么示例代码中的bean实例化在哪里呢?是通过
类MyApplication extends ResourceConfig
在web.xml中注册
MyApplication
吗?Bean实例化由Spring完成。您只需要基本上向Spring描述应用程序上下文(使用JavaConfig或XML文件),Spring将负责其余部分(即实例化+注入)。请注意,getBean仅从应用程序上下文检索现有bean,这意味着它已经被实例化。因此,在这种情况下,示例应用程序向注册bean定义。我知道bean定义在XML文件中。但是从示例代码来看,没有任何Java代码像
ApplicationContext ctx=new ClassPathXmlApplicationContext(“ApplicationContext.xml”)
可以在中实际实例化bean。所以我想知道示例中applicationContext的实例化位置。它是在web.xml配置中设置的:谢谢Brian。web.xml确实是我错过的东西。它隐藏得太深,以至于我找不到bean实例化:)