如何在JAX-RS中注入ApplicationContext

我正在使用Spring和JAX-RS编写Web服务,我对以下内容感到困惑

这是我的服务例子

@Path("/users") public class UserService { @GET @Path("{id}") @Produces("application/xml") public User getById(@PathParam("id") int id) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); UserDAO userDAO = (UserDAO) context.getBean("userDao"); return userDAO.getById(id); } } 

这是我的beans.xml

              

我想知道这是否是每次调用资源时加载Application上下文的正确技术,如果不是,我应该如何更改它?

每次对此方法进行Web服务调用时创建应用程序工厂实例肯定不是一个好方法,

因为这个方法可能会被称为100次,我们不希望有100次创建这个上下文,因为没有任何改变。

您可以实现ApplicationContextAware接口

  • 如何注入ApplicationContext本身

你可以做到

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

在其他地方,也许当你的应用程序启动时。

希望这可以帮助!

祝你好运!

Jersey参考手册详细描述了如何与Spring集成:

Jersey提供了支持Spring DI的扩展。 这使Jersey能够将Spring bean用作JAX-RS组件(例如资源和提供程序),并允许Spring注入Jersey托管组件。

Spring扩展模块配置基于注释。 注入Spring bean并使用注释对JAX-RS类进行Spring管理。 注入的Spring bean可以使用Spring XML配置注入更多依赖项。 支持Spring单例和请求范围。

为了使JAX-RS资源能够运行需要代理的Springfunction,例如Spring事务管理(使用@Transactional),Spring Security和面向方面编程(例如@Aspect),资源本身必须由Spring管理,通过注释@ Component,@ Service,@ Controller或@Repository:

 import javax.ws.rs.GET; import javax.ws.rs.Path; import org.springframework.stereotype.Component; @Component @Path("/") public class SomeResource { @Transactional @GET public void updateResource() { // ... } } 

限制:

  • 不能使用Spring XML配置将Spring bean直接注入JAX-RS类

依赖

如果您想使用Jersey Spring DI支持,则需要将jersey-spring3模块添加到依赖项列表中:

  org.glassfish.jersey.ext jersey-spring3 2.18  

上面的模块在Spring模块上添加了传递依赖。 有关依赖项列表和范围的更多详细信息,请参阅jersey-spring3模块依赖项。 请注意,该模块依赖于Spring / HK2 Bridge,用于将Spring服务注入HK2服务或向Spring服务注入HK2服务。

要查看Jersey中Spring DI支持的示例,请参阅Spring DI示例 。