问题标签 [injectableprovider]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
7785 浏览

java - 泽西岛:InjectableProvider 没有被捡起 - 春天

我目前正在尝试InjectableProvider使用 Jersey 创建一个,但我无法让 Jersey 来接它。

@Provider除了在实现上使用注释之外,我找不到任何关于其用法的真实示例,甚至找不到如何获取它。似乎在泽西岛写它的人在一些帖子中暗示这足以让它被捡起来。

我是否需要指定一些 SPI 服务文件,或者将其添加到某个工厂?

注意:我在 Glassfish 3.1 中运行,并使用 Spring 3.1。Spring 可能会以某种方式接管Providers 的自动加载,这似乎是合理的。但是,我只是不知道。无论如何,我都没有使用 Spring 来管理下面建议的 InjectableProvider,也没有尝试以其他方式添加它,这可能是我的问题。

基本实现:

参考Annotation

来自 Jersey developer 的参考链接。


更新:calvinkrishy 指出了我的想法的两个缺陷。

首先,我假设 Jersey@Provider在被传统的 Jersey-Spring servlet 启动后将开始扫描 s com.sun.jersey.spi.spring.container.servlet.SpringServlet:. 这大多是不正确的;它确实开始扫描,但它会查找具有注释的 Spring bean。

其次,我假设PerRequestTypeInjectableProvider在每次传入请求时都会询问 anInjectable来处理它控制的注释。这也是错误的。正如预期的PerRequestTypeInjectableProvider那样,在启动时实例化了,但泽西岛随后立即要求Injectable's 用给定的来处理给定的注释type,它通过扫描它拥有的 Restful 服务来确定——此时——决定它管理(也就是说,所有这些)。

PerRequestTypeInjectableProvider和之间的区别SingletonTypeInjectableProvider似乎是结果Injectable要么包含值而不为它工作(单例),要么每次都查找它的值(每个请求),从而使每个请求的值都可以更改。

这迫使我在我的AttributeInjectable(下面的代码)中做一些额外的工作,而不是像我计划的那样传递一些对象,以避免提供AttributeInjectable额外的知识,这给我的计划带来了一个较小的影响。

我希望能够从 中传递HttpServletRequestProviderAttributeInjectable仅针对每个唯一的注释/类型进行实例化。因为我不能这样做,所以我执行每个值查找,它使用 Spring 的RequestContextFilter单例,它提供了一种ThreadLocal安全检索HttpServletRequest(以及与当前请求相关的其他内容)的机制。

结果确实有效,并且它使代码更具可读性,而无需强制各种服务扩展基类只是为了隐藏 的用法@Context HttpServletRequest request,然后通过一些辅助方法将其用于访问上述属性。

然后你可以按照以下方式做一些事情:

这变得非常方便,因为我使用 Servlet 过滤器来确保用户在传递数据之前具有访问服务的适当权限,然后我可以解析传入的数据(或加载它,或其他)并将其转储到属性中要加载。

如果您不想要上述Provider方法,并且想要用于访问属性的基类,那么您可以这样做:


UPDATE2:我考虑了我AbstractAttributeInjectableProvider的. 提供一个非实现要容易得多,它在每个请求时都被告知其类型 () ,从而避免了一堆只为您提供类型的构造函数实现。这也避免了必须为要与注释一起使用的每种类型编写代码。AttributeInjectableClass<T>AttributeParamabstractClass<T>AttributeParamAttributeParam

注意:每个Injectable都在启动时实例化一次,而不是每个请求,但在每个传入请求时都会调用它们。

0 投票
1 回答
117 浏览

couchdb - 您将如何将对象池中的数据库对象注入和处理到资源中?

我一直在考虑为球衣的 jcouchdb 对象实现一个对象池。现在我问自己将 jcouchdb 实例传递到资源端点的最佳方式是什么。

我希望池有一种方法来请求 jcouchdb 对象并释放它以便可以重用它。

我的第一个想法是将 InjectableProvider 实现为单例,并在资源端点中使用注释来“抓取”它。InjectableProvider 然后从对象池中返回一个 jcouchdb 对象并将其标记为忙。使用后如何释放 jcouchdb 对象?即使我从不需要它,我也会为每个资源端点实例请求一个 jcouchdb 对象?!(不知道带注释的对象何时被实例化)

我正在考虑的另一个想法是将对象池附加到 servlet 上下文(使用 set 属性)。

还有其他想法吗?

当我谈到共享资源和球衣时,我基本上有点困惑。希望有人可以为我解决问题。

谢谢

0 投票
2 回答
216 浏览

java - 用于方法多参数可注入的自定义 InjectableProvider,解析时出错

我很难用一种干净利落的方式来实现这个 JsonParamInjectable。我在这个论坛和其他地方进行了搜索,但没有发现任何提示可以告诉我如何干净利落地实现它。

对于 jaxrs 方法:

它将 json {"a":1, "b":2} 解析为参数 a 和 b

为此,我实现了一个 InjectableProvider,它通过方法参数创建一个 JsonInjectable 实例。

魔术是在这个 JsonInjectable 中完成的,它的 where id 做了一个肮脏的把戏:

问题是,在某些情况下,实体是空的,我怀疑是一个有效的 http 请求。导致 java.io.EOFException: End of input at line 1 column 2. 这个问题出现在生产中,但我无法在测试环境中重现它。

如果有问题,肯定与“context != context2”有关。对于每个可注入对象都绑定到一个参数,并且以我无法控制的顺序调用可注入对象,并且每个可注入对象都处理相同的数据:从请求实体解析 json。所以为了避免每次都重新解析实体,我使用 context != context2 来检测它是否是一个新请求。

检测新请求的好方法是什么,因此每个请求只能发生 1 次 json 解析。

0 投票
3 回答
551 浏览

angular - 如何通过操作在 Angular 2 服务中注入提供者?

我试图在 Redux 的帮助下消除组件对 Angular 服务的依赖。

基本上,流程是组件 -> 操作 -> 服务

在服务中我要使用@angular/core的http模块,建议在构造函数中传入:

当我从操作中调用服务时,它不会获取 http 提供程序,因为我没有 http 提供程序的实例。

如何将 http 提供程序注入服务?

0 投票
0 回答
1088 浏览

angular - Angular 4 - DI:如何在我的组件中注入 IntersectionObserver

由于我想使用您可以在许多网站上看到的滚动淡入功能,我想知道如何在我的应用程序中以“角度方式”实现此类功能。我已经有一个有效的组件实现,也许这可以帮助任何需要在滚动行为上使用这种淡入的人。

我对下面(缩短的)代码的问题是它不支持依赖注入,因为它总是创建一个新的 IntersectionObserver 实例。

如您所见,这非常有效,但是对于多个组件来说设置太多,并且根本不使用依赖注入。有没有办法配置它,可能是使用ServiceFactory Provider

这些是我偶然发现的一些链接,但我不知道如何实现这样的特定案例:

为 Angular 2 中的依赖注入提供模型类的新实例

创建具有依赖关系的类的新实例,不了解工厂提供者

0 投票
2 回答
2297 浏览

angular - Angular 抽象类 HttpClient 注入

大家好,我是 Angular 的新手,我在使用 Injectable 类时遇到了麻烦。

我有一个抽象类(在 web.ts 上),它的受保护属性之一是 HttpClient 对象。这个抽象类的定义如下:

然后我有另一个类(在 webA.ts 上)扩展了 Web 类:

最后,在我的网站的一个组件类中,我想将 WebA 实例化为:

它告诉我需要super("https://www.test.com");在 webA.ts中传递一个 HttpClient 对象。为了解决这个问题,我可以为 WebA 创建如下构造函数:

但这会导致我private webA: Web = new WebA(this.http);强迫我拥有我的组件类:

我知道必须有另一种方法来做到这一点,因为在我看来,这打破了我班级的等级制度

TL;DR:
我需要在抽象类上“自动注入”一个 HttpClient,而不需要将此对象作为参数传递给扩展类中的 super。

0 投票
0 回答
44 浏览

angular - 具有延迟加载的 Angular 上的可注入提供程序生命周期

我怀疑 Angular 上的提供者何时被销毁。

这是我的提供商的一部分:

它作为提供程序注入到页面模块(延迟加载)上。当我第一次进入页面时,会显示日志并且 myState 变量是 {}。

如果我用信息修改 myState 变量并退出该页面并再次进入,则该页面将被销毁并再次创建,但不会显示 Providers 构造函数的日志,并且 myState 内容是最后修改到页面中的值。

当我创建一个页面的新实例(构造函数被执行)时,注入的提供程序不会再次创建吗?

谢谢