Skip to content

Commit 75953de

Browse files
committed
task: di function demo
1 parent f9d96b0 commit 75953de

File tree

7 files changed

+158
-59
lines changed

7 files changed

+158
-59
lines changed

di-function-sample/src/test/java/ComponentConstructionTest.java

+10-33
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
import com.google.inject.Guice;
33
import com.google.inject.Injector;
44
import javax.inject.Inject;
5+
import model.Car;
6+
import model.Engine;
7+
import model.EngineV6;
8+
import model.EngineV8;
59
import org.junit.jupiter.api.Assertions;
610
import org.junit.jupiter.api.Test;
711

@@ -11,31 +15,6 @@
1115
*/
1216
public class ComponentConstructionTest {
1317

14-
interface Car {
15-
16-
Engine engine();
17-
}
18-
19-
interface Engine {
20-
21-
String name();
22-
}
23-
24-
static class V8Engine implements Engine {
25-
26-
@Override
27-
public String name() {
28-
return "V8";
29-
}
30-
}
31-
32-
static class V6Engine implements Engine {
33-
34-
@Override
35-
public String name() {
36-
return "V6";
37-
}
38-
}
3918

4019
static final class CarInjectedByConstructor implements Car {
4120

@@ -46,7 +25,7 @@ static final class CarInjectedByConstructor implements Car {
4625
this.engine = engine;
4726
}
4827

49-
public Engine engine() {
28+
public Engine getEngine() {
5029
return engine;
5130
}
5231
}
@@ -57,7 +36,7 @@ static class CarInjectedByField implements Car {
5736
private Engine engine;
5837

5938
@Override
60-
public Engine engine() {
39+
public Engine getEngine() {
6140
return engine;
6241
}
6342
}
@@ -67,28 +46,26 @@ public void inject_by_constructor() {
6746
Injector injector = Guice.createInjector(new AbstractModule() {
6847
@Override
6948
protected void configure() {
70-
bind(Engine.class).to(V8Engine.class);
49+
bind(Engine.class).to(EngineV8.class);
7150
bind(Car.class).to(CarInjectedByConstructor.class);
7251
}
7352
});
7453

7554
Car car = injector.getInstance(Car.class);
76-
Assertions.assertEquals(new V8Engine().name(), car.engine().name());
55+
Assertions.assertEquals(new EngineV8().name(), car.getEngine().name());
7756
}
7857

7958
@Test
8059
public void inject_by_field() {
8160
Injector injector = Guice.createInjector(new AbstractModule() {
8261
@Override
8362
protected void configure() {
84-
bind(Engine.class).to(V6Engine.class);
63+
bind(Engine.class).to(EngineV6.class);
8564
bind(Car.class).to(CarInjectedByField.class);
8665
}
8766
});
8867

8968
Car car = injector.getInstance(Car.class);
90-
Assertions.assertEquals(new V6Engine().name(), car.engine().name());
69+
Assertions.assertEquals(new EngineV6().name(), car.getEngine().name());
9170
}
92-
93-
9471
}

di-function-sample/src/test/java/NamedInjectTest.java

+51-26
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
1+
import static org.junit.jupiter.api.Assertions.assertEquals;
12
import static org.junit.jupiter.api.Assertions.assertThrows;
23

34
import com.google.inject.AbstractModule;
45
import com.google.inject.Guice;
56
import com.google.inject.Injector;
67
import java.lang.annotation.Annotation;
8+
import java.lang.annotation.ElementType;
9+
import java.lang.annotation.Retention;
10+
import java.lang.annotation.RetentionPolicy;
11+
import java.lang.annotation.Target;
712
import javax.inject.Inject;
813
import javax.inject.Named;
14+
import javax.inject.Qualifier;
15+
import model.Car;
16+
import model.Engine;
17+
import model.EngineV6;
18+
import model.EngineV8;
919
import org.junit.jupiter.api.Assertions;
1020
import org.junit.jupiter.api.Test;
1121

@@ -15,16 +25,6 @@
1525
*/
1626
public class NamedInjectTest {
1727

18-
interface Engine {
19-
20-
String name();
21-
}
22-
23-
interface Car {
24-
25-
Engine getEngine();
26-
}
27-
2828
static class CarWithNamedInject implements Car {
2929

3030
@Inject
@@ -45,22 +45,6 @@ public Class<? extends Annotation> annotationType() {
4545
}
4646
}
4747

48-
static class EngineV8 implements Engine {
49-
50-
@Override
51-
public String name() {
52-
return "V8";
53-
}
54-
}
55-
56-
static class EngineV6 implements Engine {
57-
58-
@Override
59-
public String name() {
60-
return "V6";
61-
}
62-
}
63-
6448
@Test
6549
public void should_injected_by_named() {
6650
Injector injector = Guice.createInjector(new AbstractModule() {
@@ -85,4 +69,45 @@ protected void configure() {
8569
}));
8670
}
8771

72+
@Qualifier
73+
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD})
74+
@Retention(RetentionPolicy.RUNTIME)
75+
public @interface Super {
76+
77+
}
78+
79+
record SuperEngine() implements Super {
80+
81+
@Override
82+
public Class<? extends Annotation> annotationType() {
83+
return Super.class;
84+
}
85+
}
86+
87+
static class SuperEngineCar implements Car {
88+
89+
@Inject
90+
@Super
91+
Engine engine;
92+
93+
@Override
94+
public Engine getEngine() {
95+
return engine;
96+
}
97+
}
98+
99+
@Test
100+
public void should_inject_by_special_annotation() {
101+
Injector injector = Guice.createInjector(new AbstractModule() {
102+
@Override
103+
protected void configure() {
104+
bind(Engine.class).annotatedWith(new SuperEngine()).to(EngineV8.class);
105+
bind(Car.class).to(SuperEngineCar.class);
106+
}
107+
});
108+
109+
Car car = injector.getInstance(Car.class);
110+
assertEquals(new EngineV8().name(), car.getEngine().name());
111+
}
112+
88113
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import static org.junit.jupiter.api.Assertions.assertNotSame;
2+
import static org.junit.jupiter.api.Assertions.assertSame;
3+
4+
import com.google.inject.AbstractModule;
5+
import com.google.inject.Guice;
6+
import com.google.inject.Injector;
7+
import com.google.inject.internal.SingletonScope;
8+
import javax.inject.Inject;
9+
import model.Car;
10+
import model.Engine;
11+
import model.EngineV8;
12+
import org.junit.jupiter.api.Test;
13+
14+
/**
15+
* @author wynn5a
16+
* @date 2022/4/22
17+
*/
18+
public class ScopeTest {
19+
20+
static class MotorCar implements Car {
21+
22+
@Inject
23+
private Engine engine;
24+
25+
@Override
26+
public Engine getEngine() {
27+
return engine;
28+
}
29+
}
30+
31+
32+
@Test
33+
public void should_inject_with_scope() {
34+
Injector injector = Guice.createInjector(new AbstractModule() {
35+
@Override
36+
protected void configure() {
37+
bind(Engine.class).to(EngineV8.class).in(new SingletonScope());
38+
bind(Car.class).to(MotorCar.class);
39+
}
40+
});
41+
42+
Car car = injector.getInstance(Car.class);
43+
Car car2 = injector.getInstance(Car.class);
44+
assertNotSame(car, car2);
45+
assertSame(car.getEngine(), car2.getEngine());
46+
}
47+
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package model;
2+
3+
4+
/**
5+
* @author wynn5a
6+
* @date 2022/4/22
7+
*/
8+
public interface Car {
9+
10+
Engine getEngine();
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package model;
2+
3+
/**
4+
* @author wynn5a
5+
* @date 2022/4/22
6+
*/
7+
public interface Engine {
8+
String name();
9+
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package model;
2+
3+
/**
4+
* @author wynn5a
5+
* @date 2022/4/22
6+
*/
7+
public class EngineV6 implements Engine {
8+
9+
@Override
10+
public String name() {
11+
return "V6";
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package model;
2+
3+
/**
4+
* @author wynn5a
5+
* @date 2022/4/22
6+
*/
7+
public class EngineV8 implements Engine {
8+
9+
10+
@Override
11+
public String name() {
12+
return "V8";
13+
}
14+
15+
}

0 commit comments

Comments
 (0)