在 Guice 中为依赖注入绑定相同类型两次(例如包装器)的最佳方法是什么?
What is the best way to bind the same type twice (e.g. a wrapper) for dependency injection in Guice?
假设我有一个服务类型 Service
,它有许多不同的实现,ServiceImplX
和 ServiceImplY
。我还有一个缓存层 CachedService
,它实现了 Service
并包装了 Service
的一些基本实现以访问数据。
我想要的是能够绑定 ServiceImplX
和 ServiceImplY
之一作为要注入 CachedService
的基本实现,而 CachedService
本身应该是绑定到 Service
以注入到此服务的实际客户端中。
我想避免命名注释来解决这个问题,因为这看起来很脆弱。有没有更安全的方法来实现这一点?
定义适当的绑定注解:
@RetentionPolicy(RUNTIME)
@BindingAnnotation
@interface ServiceBinding {}
这比 @Named
绑定注释更健壮,因为:
- 它是一个符号,就像 class 名称或变量一样,因此您可以在代码中轻松找到对它的引用;
@Named
注释中的名称可以在运行时构建,因此更难找到。
- 您可以通过
public
/private
等修饰符控制绑定注解的可访问性,因此您可以控制配置和引用注解的位置。 @Named
个注解的字符串在全局范围内。
假设我有一个服务类型 Service
,它有许多不同的实现,ServiceImplX
和 ServiceImplY
。我还有一个缓存层 CachedService
,它实现了 Service
并包装了 Service
的一些基本实现以访问数据。
我想要的是能够绑定 ServiceImplX
和 ServiceImplY
之一作为要注入 CachedService
的基本实现,而 CachedService
本身应该是绑定到 Service
以注入到此服务的实际客户端中。
我想避免命名注释来解决这个问题,因为这看起来很脆弱。有没有更安全的方法来实现这一点?
定义适当的绑定注解:
@RetentionPolicy(RUNTIME)
@BindingAnnotation
@interface ServiceBinding {}
这比 @Named
绑定注释更健壮,因为:
- 它是一个符号,就像 class 名称或变量一样,因此您可以在代码中轻松找到对它的引用;
@Named
注释中的名称可以在运行时构建,因此更难找到。 - 您可以通过
public
/private
等修饰符控制绑定注解的可访问性,因此您可以控制配置和引用注解的位置。@Named
个注解的字符串在全局范围内。