File tree Expand file tree Collapse file tree 8 files changed +120
-2
lines changed
inject/src/main/java/io/avaje/inject/spi
inject-generator/src/main/java/io/avaje/inject/generator
inject-test/src/test/java/org/example Expand file tree Collapse file tree 8 files changed +120
-2
lines changed Original file line number Diff line number Diff line change @@ -23,14 +23,18 @@ String getFieldName() {
23
23
String builderGetDependency () {
24
24
StringBuilder sb = new StringBuilder ();
25
25
sb .append ("b." ).append (type .getMethod ());
26
- sb .append (type . rawType ()).append (".class" );
26
+ sb .append (getFieldType ()).append (".class" );
27
27
if (name != null ) {
28
28
sb .append (",\" " ).append (name ).append ("\" " );
29
29
}
30
30
sb .append (")" );
31
31
return sb .toString ();
32
32
}
33
33
34
+ private String getFieldType () {
35
+ return Util .unwrapProvider (type .rawType ());
36
+ }
37
+
34
38
/**
35
39
* Check for request scoped dependency.
36
40
*/
Original file line number Diff line number Diff line change
1
+ package org .example .coffee .provider ;
2
+
3
+ import javax .inject .Inject ;
4
+ import javax .inject .Provider ;
5
+ import javax .inject .Singleton ;
6
+
7
+ @ Singleton
8
+ class FieldInjectProvider {
9
+
10
+ @ Inject
11
+ Provider <AProv > aProvProvider ;
12
+
13
+ AProv testGet () {
14
+ return aProvProvider .get ();
15
+ }
16
+ }
Original file line number Diff line number Diff line change
1
+ package org .example .coffee .provider ;
2
+
3
+ import io .avaje .inject .SystemContext ;
4
+ import org .junit .jupiter .api .Test ;
5
+
6
+ import static org .assertj .core .api .Assertions .assertThat ;
7
+
8
+ class FieldInjectProviderTest {
9
+
10
+ @ Test
11
+ void test () {
12
+
13
+ FieldInjectProvider bean = SystemContext .getBean (FieldInjectProvider .class );
14
+ AProv aProv = bean .testGet ();
15
+
16
+ assertThat (aProv ).isNotNull ();
17
+
18
+ AProv beanDirect = SystemContext .getBean (AProv .class );
19
+ assertThat (aProv ).isSameAs (beanDirect );
20
+ }
21
+ }
Original file line number Diff line number Diff line change
1
+ package org .example .missing ;
2
+
3
+ import javax .inject .Singleton ;
4
+
5
+ /**
6
+ * Has only 1 public constructor so that is chosen for injection.
7
+ */
8
+ @ Singleton
9
+ public class MFooUser2 {
10
+
11
+ private final MFoo mf ;
12
+ private final boolean usePublicConstructor ;
13
+
14
+ public MFooUser2 (MFoo mf ) {
15
+ this .mf = mf ;
16
+ this .usePublicConstructor = true ;
17
+ }
18
+
19
+ /**
20
+ * Extra protected constructor usually for unit testing purposes only.
21
+ */
22
+ MFooUser2 (MFoo mf , boolean dummy ) {
23
+ this .mf = mf ;
24
+ this .usePublicConstructor = true ;
25
+ }
26
+
27
+ public boolean isUsePublicConstructor () {
28
+ return usePublicConstructor ;
29
+ }
30
+ }
Original file line number Diff line number Diff line change
1
+ package org .example .missing ;
2
+
3
+ import io .avaje .inject .SystemContext ;
4
+ import org .junit .jupiter .api .Test ;
5
+
6
+ import static org .assertj .core .api .Assertions .assertThat ;
7
+
8
+ class SinglePublicConstructorTest {
9
+
10
+ @ Test
11
+ void beanWithSinglePublicConstructor_expect_publicConstructorChosen () {
12
+
13
+ MFooUser2 bean = SystemContext .getBean (MFooUser2 .class );
14
+
15
+ assertThat (bean .isUsePublicConstructor ()).isTrue ();
16
+ }
17
+ }
Original file line number Diff line number Diff line change @@ -56,6 +56,11 @@ class DBuilder implements Builder {
56
56
*/
57
57
private Class <?> injectTarget ;
58
58
59
+ /**
60
+ * Flag set when we are running post construct injection.
61
+ */
62
+ private boolean runningPostConstruct ;
63
+
59
64
Builder parent ;
60
65
61
66
/**
@@ -224,6 +229,9 @@ public <T> Provider<T> getProvider(Class<T> cls) {
224
229
225
230
@ Override
226
231
public <T > Provider <T > getProvider (Class <T > cls , String name ) {
232
+ if (runningPostConstruct ) {
233
+ return new ProviderWrapper <>(get (cls , name ));
234
+ }
227
235
ProviderPromise <T > promise = new ProviderPromise <>(cls , name );
228
236
injectors .add (promise );
229
237
return promise ;
@@ -256,6 +264,7 @@ private void runInjectors() {
256
264
if (name != null ) {
257
265
log .debug ("perform field injection in context:{}" , name );
258
266
}
267
+ runningPostConstruct = true ;
259
268
for (Consumer <Builder > injector : injectors ) {
260
269
injector .accept (this );
261
270
}
Original file line number Diff line number Diff line change
1
+ package io .avaje .inject .spi ;
2
+
3
+ import javax .inject .Provider ;
4
+
5
+ /**
6
+ * Just wrap a bean.
7
+ */
8
+ class ProviderWrapper <T > implements Provider <T > {
9
+
10
+ private T bean ;
11
+
12
+ ProviderWrapper (T bean ) {
13
+ this .bean = bean ;
14
+ }
15
+
16
+ @ Override
17
+ public T get () {
18
+ return bean ;
19
+ }
20
+
21
+ }
Original file line number Diff line number Diff line change 26
26
<modules >
27
27
<module >inject</module >
28
28
<module >inject-generator</module >
29
- <!-- <module>inject-test</module> -- >
29
+ <module >inject-test</module >
30
30
</modules >
31
31
</project >
32
32
You can’t perform that action at this time.
0 commit comments