aza*_*lut 1 java integration dependency-injection jersey guice
我的问题是:在创建部署在某种servlet容器(如jetty或tomcat)上的应用程序时,为什么在执行JavaSE应用程序和ServletModule时需要创建AbstractModule?它们之间有什么区别?
我需要将Jersey与Guice整合在一起.是否有必要为泽西岛注册Guice的存在以某种方式使用它?我不能只是启用注射并在我想要的任何地方(普通类,过滤器,处理程序,服务,DAO等)执行它们吗?为什么我不能像在JavaSE应用程序中那样配置guice,而是需要使用ServletModule?
据我在网上看到,有很多使用Guice的HK2服务的例子,反之亦然,所以我认为它很重要?(必要?)
谢谢
An AbstractModule是Guice的bootstrap(配置)阶段的基本构建块.你总是需要一个或多个.另一方面,a ServletModule是一个特殊化,它为你做了一些配置,因为它在servlet容器中运行.
来自Guice文档:
此模块设置请求和会话范围,并提供从中配置过滤器和servlet的位置.
关于Guice-Jersey集成,您当然需要进行设置.它不会突然发挥作用.Guice和任何其他依赖注入框架一样,在它可以控制构建对象时起作用.如有疑问,请问自己是谁创造了这个对象.
使用Jersey和JAX-RS,谁创建了对象?不是你,你只是定义它们.容器创建它们.JAX-RS运行时.在您的情况下,Jersey运行时.而泽西在内部使用HK2依赖注入框架.所以你需要桥接这两个框架,以便注入你用一些Guice资源定义的JAX-RS类.或者相反!这就是为什么有一个HK2-guice桥的原因.因此,Jersey将使用HK2构建您的对象,而HK2也会在Guice上查找您的资源.
一个简单的例子.我使用此代码初始化REST API,我想在其中注入Guice资源.
@ApplicationPath("api")
public class ApiRest extends ResourceConfig {
private static final Logger log = LoggerFactory.getLogger(ApiRest.class);
@Inject
public ApiRest(ServiceLocator serviceLocator, ServletContext servletContext) {
log.debug("Inicialitzant Jersey.");
packages("net.sargue.app.api");
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName());
if (injector == null)
throw new RuntimeException("Guice Injector not found");
guiceBridge.bridgeGuiceInjector(injector);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,上面的示例需要ServletModule注册,因为它从中拉出Guice注入器ServletContext.或者您可以将注射器添加ServletContext到其他位置.或者只是在初始化REST API时创建注入器,它取决于您的首选项和应用程序.
| 归档时间: |
|
| 查看次数: |
1783 次 |
| 最近记录: |