dependency-injection - HK2 代理与 javax.inject.Provider
问题描述
我有两个绑定到依赖注入器的单例服务(通过 Jersey):
ResourceConfig.register(new AbstractBinder() {
@Override
protected void configure() {
bind(Foo.class)
.to(Foo.class)
.in(Singleton.class);
bind(Bar.class)
.to(Bar.class)
.in(Singleton.class);
}
});
Foo
使用Bar
,所以我可以简单地执行以下操作:
public class Foo {
@javax.inject.Inject private Bar bar;
}
如果Foo
只是Bar
很少使用,那么我可以推迟它的构造:
public class Foo {
@javax.inject.Inject private javax.inject.Provider<Bar> bar;
}
我还读过,Provider
通常建议使用 using,因为它避免了这种急切的评估和循环依赖(尽管我尽量避免这些)。
但是让它成为代理呢?
ResourceConfig.register(new AbstractBinder() {
@Override
protected void configure() {
bind(Foo.class)
.to(Foo.class)
.in(Singleton.class)
.proxy(true)
.proxyForSameScope(true);
bind(Bar.class)
.to(Bar.class)
.in(Singleton.class)
.proxy(true)
.proxyForSameScope(true);
}
});
我是注射新手,所以不确定历史。对于两个不同的框架,它们实际上是相同的概念吗?
代理使代码看起来更好,并将关注点推送给服务的创建者而不是它的用户(这可能是可取的,也可能不是可取的)。这有什么缺点Provider
吗?
请注意,这里唯一考虑的是单例服务。
解决方案
这纯粹是一种观点,但出于您提到的大多数原因,我自己更喜欢代理。一般来说代理接口更好,因为这样会使用 JDK 代理,但只要您的 Bar 类遵循代理规则,您仍然可以。
推荐阅读
- spring-boot - unable to figure out what is going on to the spring boot application on deployment on google app engine?
- amazon-web-services - 我是否需要在 ECS 所在的同一 VPC 中创建 SQS?
- python - How to combine only first and last column from each Excel sheet into new excel using panas in python?
- javascript - i++ 循环没有任何问题,i+2 无限循环并崩溃
- python - 如何使用 Selenium 和 Python 从定位的元素中抓取文本
- opencv - OpenCV ndarray image save fails after serialization
- javascript - Partial download of mp4 file with rn-fetch-blob, react-native-video throwing unrecognized error
- python - 如何在 Python 中嵌套列表理解
- mysql - 将数据保存在 JSON 中与 MySQL 中的独立列
- lua - io.popen 如何在 lua 中获取 go 输出