我们一直在 AWS Lambdas 中使用 Guice 进行 DI,但现在正在转向 Spring Boot 和长期运行的服务。
我们在 Guice 中将功能切换作为动态代理,但需要在 Spring 中实现。
假设我们有一个SomeFeature
接口和两个实现DisabledImplementation
,并且EnabledImplementation
.
我可以通过标记DisabledImplementation
with@Component("some.feature.disabled")
和EnabledImplementation
with@Component("some.feature.enabled")
然后编写一个这样的实现来非常接近:
@Primary
@Component
public class FlippingFeature implements SomeFeature {
private final SomeFeature enabled;
private final SomeFeature disabled;
private final FeatureFlip featureFlip;
@Inject
public FlippingFeature(@Named("some.feature.enabled") SomeFeature enabled,
@Named("some.feature.disabled") SomeFeature disabled,
FeatureFlip featureFlip) {
this.enabled = enabled;
this.disabled = disabled;
this.featureFlip = featureFlip;
}
@Override
public String foo() {
return featureFlip.isEnabled("some.feature") ? enabled.foo() : disabled.foo();
}
}
但我宁愿根本不编写FlippingFeature
课程,而是使用隐藏的动态代理来完成。我可以用自定义BeanFactoryPostProcessor
或其他东西来做到这一点吗?