Skip to content

Commit d3be768

Browse files
authored
Add support for method based injection. (#66)
1 parent 0fe853e commit d3be768

File tree

6 files changed

+71
-10
lines changed

6 files changed

+71
-10
lines changed

inject-generator/src/main/java/io/avaje/inject/generator/BeanReader.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class BeanReader {
4545

4646
private final List<FieldReader> injectFields = new ArrayList<>();
4747

48+
private final List<MethodReader> injectMethods = new ArrayList<>();
49+
4850
private final List<String> interfaceTypes = new ArrayList<>();
4951

5052
private String addForType;
@@ -146,6 +148,10 @@ List<FieldReader> getInjectFields() {
146148
return injectFields;
147149
}
148150

151+
List<MethodReader> getInjectMethods() {
152+
return injectMethods;
153+
}
154+
149155
void read(boolean factory) {
150156
for (Element element : beanType.getEnclosedElements()) {
151157
ElementKind kind = element.getKind();
@@ -169,6 +175,10 @@ void read(boolean factory) {
169175
for (FieldReader fields : injectFields) {
170176
fields.checkRequest(requestParams);
171177
}
178+
for (MethodReader methods : injectMethods) {
179+
methods.addImports(importTypes);
180+
methods.checkRequest(requestParams);
181+
}
172182
for (MethodReader factoryMethod : factoryMethods) {
173183
factoryMethod.addImports(importTypes);
174184
}
@@ -245,6 +255,15 @@ private void readMethod(Element element, boolean factory) {
245255
}
246256
}
247257

258+
Inject inject = element.getAnnotation(Inject.class);
259+
if (inject != null) {
260+
MethodReader methodReader = new MethodReader(context, methodElement, beanType);
261+
methodReader.read();
262+
if (!methodReader.getParams().isEmpty()) {
263+
injectMethods.add(methodReader);
264+
}
265+
}
266+
248267
if (context.isPostConstructAvailable()) {
249268
PostConstruct pcMarker = element.getAnnotation(PostConstruct.class);
250269
if (pcMarker != null) {
@@ -309,6 +328,10 @@ boolean isFieldInjectionRequired() {
309328
return !injectFields.isEmpty();
310329
}
311330

331+
boolean isMethodInjectionRequired() {
332+
return !injectMethods.isEmpty();
333+
}
334+
312335
void buildAddFor(Append writer) {
313336
writer.append(" if (builder.isAddBeanFor(");
314337
if (addForType != null) {
@@ -413,6 +436,9 @@ void writeRequestCreate(Append writer) {
413436
for (FieldReader field : injectFields) {
414437
field.writeRequestDependency(writer);
415438
}
439+
for (MethodReader method : injectMethods) {
440+
method.writeRequestDependency(writer);
441+
}
416442
requestParams.writeRequestCreate(writer);
417443
writer.resetNextName();
418444
writer.append(" %s bean = new %s(", shortName, shortName);
@@ -423,6 +449,11 @@ void writeRequestCreate(Append writer) {
423449
for (FieldReader field : injectFields) {
424450
field.writeRequestInject(writer);
425451
}
452+
for (MethodReader method : injectMethods) {
453+
writer.append(" bean.%s(", method.getName());
454+
method.writeRequestConstructor(writer);
455+
writer.append(");").eol();
456+
}
426457
writer.append(" return bean;").eol();
427458
writer.append(" }").eol();
428459
}

inject-generator/src/main/java/io/avaje/inject/generator/MethodReader.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ String builderBuildBean() {
125125
if (i > 0) {
126126
sb.append(",");
127127
}
128-
sb.append(params.get(i).builderGetDependency());
128+
sb.append(params.get(i).builderGetDependency("builder"));
129129
}
130130
sb.append(");");
131131
return sb.toString();
@@ -268,13 +268,13 @@ static class MethodParam {
268268
this.genericType = GenericType.maybe(paramType);
269269
}
270270

271-
String builderGetDependency() {
271+
String builderGetDependency(String builderName) {
272272
StringBuilder sb = new StringBuilder();
273273
if (genericType != null) {
274274
// passed as provider to build method
275275
sb.append("prov").append(providerIndex).append(".get(");
276276
} else {
277-
sb.append("builder.").append(utilType.getMethod());
277+
sb.append(builderName).append(".").append(utilType.getMethod());
278278
}
279279
if (genericType == null) {
280280
sb.append(Util.shortName(paramType)).append(".class");

inject-generator/src/main/java/io/avaje/inject/generator/SimpleBeanWriter.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,13 @@ private void writeStaticFactoryMethod() {
9797
param.addProviderParam(writer, providerIndex++);
9898
}
9999
}
100-
100+
for (MethodReader methodReader : beanReader.getInjectMethods()) {
101+
for (MethodReader.MethodParam param : methodReader.getParams()) {
102+
if (param.isGenericType()) {
103+
param.addProviderParam(writer, providerIndex++);
104+
}
105+
}
106+
}
101107
writer.append(") {").eol();
102108

103109
beanReader.buildAddFor(writer);
@@ -109,21 +115,32 @@ private void writeStaticFactoryMethod() {
109115
if (i > 0) {
110116
writer.append(",");
111117
}
112-
writer.append(params.get(i).builderGetDependency());
118+
writer.append(params.get(i).builderGetDependency("builder"));
113119
}
114120
writer.append(");").eol();
115121

116122
beanReader.buildRegister(writer);
117123
if (beanReader.isLifecycleRequired()) {
118124
beanReader.buildAddLifecycle(writer);
119125
}
120-
if (beanReader.isFieldInjectionRequired()) {
126+
if (beanReader.isFieldInjectionRequired() || beanReader.isMethodInjectionRequired()) {
121127
writer.append(" builder.addInjector(b -> {").eol();
122128
for (FieldReader fieldReader : beanReader.getInjectFields()) {
123129
String fieldName = fieldReader.getFieldName();
124130
String getDependency = fieldReader.builderGetDependency();
125131
writer.append(" $bean.%s = %s;", fieldName, getDependency).eol();
126132
}
133+
for (MethodReader methodReader : beanReader.getInjectMethods()) {
134+
writer.append(" $bean.%s(", methodReader.getName());
135+
List<MethodReader.MethodParam> methodParams = methodReader.getParams();
136+
for (int i = 0; i < methodParams.size(); i++) {
137+
if (i > 0) {
138+
writer.append(",");
139+
}
140+
writer.append(methodParams.get(i).builderGetDependency("b"));
141+
}
142+
writer.append(");").eol();
143+
}
127144
writer.append(" });").eol();
128145
}
129146
writer.append(" }").eol();

inject-test/src/test/java/org/example/coffee/fruit/AppleService.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,17 @@ class AppleService {
99
@Inject
1010
BananaService bananaService;
1111

12-
@Inject
1312
PeachService peachService;
1413

14+
@Inject
15+
void setPeachService(PeachService peachService) {
16+
this.peachService = peachService;
17+
}
18+
1519
String ban() {
1620
return bananaService.ban("hello");
1721
}
1822

19-
2023
void apple(String a, String b, String c) {
2124
System.out.println("apple> a: " + a + " b:" + b + " c:" + c);
2225
bananaService.banana(a, b, c);

inject-test/src/test/java/org/example/request/AController.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,14 @@ public class AController {
1212
@Inject
1313
AService service;
1414

15-
@Inject
1615
Context context;
1716

17+
@Inject
18+
AController withContext(Context context) {
19+
this.context = context;
20+
return this;
21+
}
22+
1823
public String get() {
1924
return "hi " + context.toString() + service.hi();
2025
}

inject-test/src/test/java/org/example/request/JexController.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,14 @@ public class JexController {
1212
@Inject
1313
AService service;
1414

15-
@Inject
1615
Context context;
1716

17+
@Inject
18+
JexController withContext(Context context) {
19+
this.context = context;
20+
return this;
21+
}
22+
1823
public String get() {
1924
return "hi " + context.toString() + service.hi();
2025
}

0 commit comments

Comments
 (0)