Skip to content

Commit d715f36

Browse files
committed
feature flag patterns
1 parent cf86383 commit d715f36

File tree

8 files changed

+29
-20
lines changed

8 files changed

+29
-20
lines changed

spring-boot/feature-flags/src/main/java/io/reflectoring/featureflags/patterns/replacebean/FeatureFlagEvaluation.java

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@
44

55
import java.lang.reflect.InvocationHandler;
66
import java.lang.reflect.Proxy;
7+
import java.util.function.Supplier;
78

8-
public class FeatureFlaggedBean<T> implements FactoryBean<T> {
9+
public class FeatureFlagFactoryBean<T> implements FactoryBean<T> {
910

1011
private final Class<T> targetClass;
11-
private final FeatureFlagEvaluation featureFlagEvaluation;
12+
private final Supplier<Boolean> featureFlagEvaluation;
1213
private final T beanWhenTrue;
1314
private final T beanWhenFalse;
1415

15-
public FeatureFlaggedBean(Class<T> targetClass, FeatureFlagEvaluation featureFlagEvaluation, T beanWhenTrue, T beanWhenFalse) {
16+
public FeatureFlagFactoryBean(Class<T> targetClass, Supplier<Boolean> featureFlagEvaluation, T beanWhenTrue, T beanWhenFalse) {
1617
this.targetClass = targetClass;
1718
this.featureFlagEvaluation = featureFlagEvaluation;
1819
this.beanWhenTrue = beanWhenTrue;
@@ -21,9 +22,8 @@ public FeatureFlaggedBean(Class<T> targetClass, FeatureFlagEvaluation featureFla
2122

2223
@Override
2324
public T getObject() {
24-
2525
InvocationHandler invocationHandler = (proxy, method, args) -> {
26-
if (featureFlagEvaluation.evaluate()) {
26+
if (featureFlagEvaluation.get()) {
2727
return method.invoke(beanWhenTrue, args);
2828
} else {
2929
return method.invoke(beanWhenFalse, args);

spring-boot/feature-flags/src/main/java/io/reflectoring/featureflags/patterns/replacebean/FeatureFlaggedService.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@
44
import org.springframework.stereotype.Component;
55

66
@Component("replaceBeanFeatureFlaggedService")
7-
class FeatureFlaggedService extends FeatureFlaggedBean<Service> {
7+
class FeatureFlaggedService extends FeatureFlagFactoryBean<Service> {
88

99
public FeatureFlaggedService(FeatureFlagService featureFlagService) {
10-
super(Service.class, featureFlagService::isNewServiceEnabled, new NewService(), new OldService());
10+
super(
11+
Service.class,
12+
featureFlagService::isNewServiceEnabled,
13+
new NewService(),
14+
new OldService());
1115
}
1216
}

spring-boot/feature-flags/src/main/java/io/reflectoring/featureflags/patterns/replacemethod/FeatureFlaggedService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ public int doSomething() {
2626
return oldService.doSomething();
2727
}
2828
}
29+
2930
}

spring-boot/feature-flags/src/main/java/io/reflectoring/featureflags/patterns/replacemethod/NewService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ class NewService implements Service {
88
public int doSomething() {
99
return 42;
1010
}
11+
1112
}

spring-boot/feature-flags/src/main/java/io/reflectoring/featureflags/patterns/replacemethod/OldService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,9 @@ class OldService implements Service {
88
public int doSomething() {
99
return 1;
1010
}
11+
12+
public int doSomethingElse(){
13+
return 2;
14+
}
15+
1116
}

spring-boot/feature-flags/src/main/java/io/reflectoring/featureflags/patterns/replacemodule/FeatureFlaggedServiceModule.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.reflectoring.featureflags.patterns.replacemodule;
22

33
import io.reflectoring.featureflags.FeatureFlagService;
4-
import io.reflectoring.featureflags.patterns.replacebean.FeatureFlaggedBean;
4+
import io.reflectoring.featureflags.patterns.replacebean.FeatureFlagFactoryBean;
55
import io.reflectoring.featureflags.patterns.replacemodule.newmodule.NewService1;
66
import io.reflectoring.featureflags.patterns.replacemodule.newmodule.NewService2;
77
import io.reflectoring.featureflags.patterns.replacemodule.oldmodule.OldService1;
@@ -19,13 +19,13 @@ public FeatureFlaggedServiceModule(FeatureFlagService featureFlagService) {
1919
}
2020

2121
@Bean("replaceModuleService1")
22-
FeatureFlaggedBean<Service1> service1() {
23-
return new FeatureFlaggedBean<>(Service1.class, featureFlagService::isNewServiceEnabled, new NewService1(), new OldService1());
22+
FeatureFlagFactoryBean<Service1> service1() {
23+
return new FeatureFlagFactoryBean<>(Service1.class, featureFlagService::isNewServiceEnabled, new NewService1(), new OldService1());
2424
}
2525

2626
@Bean("replaceModuleService2")
27-
FeatureFlaggedBean<Service2> service2() {
28-
return new FeatureFlaggedBean<>(Service2.class, featureFlagService::isNewServiceEnabled, new NewService2(), new OldService2());
27+
FeatureFlagFactoryBean<Service2> service2() {
28+
return new FeatureFlagFactoryBean<>(Service2.class, featureFlagService::isNewServiceEnabled, new NewService2(), new OldService2());
2929
}
3030

3131
}

spring-boot/feature-flags/src/test/java/io/reflectoring/featureflags/patterns/replacemethod/ReplaceMethodTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ public class ReplaceMethodTest {
2020
@Autowired
2121
private Service service;
2222

23+
@Autowired
24+
private OldService oldService;
25+
2326
@BeforeEach
2427
void resetMocks() {
2528
Mockito.reset(featureFlagService);
@@ -29,12 +32,15 @@ void resetMocks() {
2932
void oldServiceTest() {
3033
given(featureFlagService.isNewServiceEnabled()).willReturn(false);
3134
assertThat(service.doSomething()).isEqualTo(1);
35+
assertThat(oldService.doSomethingElse()).isEqualTo(2);
3236
}
3337

3438
@Test
3539
void newServiceTest() {
3640
given(featureFlagService.isNewServiceEnabled()).willReturn(true);
3741
assertThat(service.doSomething()).isEqualTo(42);
42+
// doSomethingElse() is not behind a feature flag, so it should return the same value independant of the feature flag
43+
assertThat(oldService.doSomethingElse()).isEqualTo(2);
3844
}
3945

4046
}

0 commit comments

Comments
 (0)