From ed7654b4cfd788d44d632b61a687a061ac70afe2 Mon Sep 17 00:00:00 2001
From: Josiah Noel <32279667+SentryMan@users.noreply.github.com>
Date: Wed, 24 Apr 2024 18:26:44 -0400
Subject: [PATCH 01/12] Add Avaje Inject Module
---
modules/jooby-avaje-inject/pom.xml | 54 +++++++++++++++
.../jooby/avaje/inject/AvajeInjectModule.java | 68 +++++++++++++++++++
.../avaje/inject/AvajeInjectRegistry.java | 42 ++++++++++++
.../avaje/inject/JoobyPropertyPlugin.java | 31 +++++++++
modules/jooby-avaje-jsonb/pom.xml | 6 ++
modules/jooby-bom/pom.xml | 5 ++
modules/pom.xml | 1 +
pom.xml | 20 ++++++
8 files changed, 227 insertions(+)
create mode 100644 modules/jooby-avaje-inject/pom.xml
create mode 100644 modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
create mode 100644 modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectRegistry.java
create mode 100644 modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java
diff --git a/modules/jooby-avaje-inject/pom.xml b/modules/jooby-avaje-inject/pom.xml
new file mode 100644
index 0000000000..f5f9e84144
--- /dev/null
+++ b/modules/jooby-avaje-inject/pom.xml
@@ -0,0 +1,54 @@
+
+
+
+
+ io.jooby
+ modules
+ 3.1.0-SNAPSHOT
+
+
+ 4.0.0
+ jooby-avaje-inject
+
+
+
+ io.jooby
+ jooby
+ ${jooby.version}
+
+
+
+
+ io.avaje
+ avaje-inject
+
+
+
+ io.avaje
+ avaje-inject-generator
+ provided
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+
+ org.mockito
+ mockito-core
+ test
+
+
+
+ org.jacoco
+ org.jacoco.agent
+ runtime
+ test
+
+
+
diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
new file mode 100644
index 0000000000..c5428f4f5b
--- /dev/null
+++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
@@ -0,0 +1,68 @@
+/*
+ * Jooby https://jooby.io
+ * Apache License Version 2.0 https://jooby.io/LICENSE.txt
+ * Copyright 2014 Edgar Espina
+ */
+package io.jooby.avaje.inject;
+
+import io.avaje.inject.BeanScope;
+import io.avaje.inject.BeanScopeBuilder;
+import io.jooby.Extension;
+import io.jooby.Jooby;
+
+/**
+ * Avaje Inject module: https://jooby.io/modules/avaje-inject.
+ *
+ *
Jooby integrates the {@link io.jooby.ServiceRegistry} into the Avaje DI framework.
+ *
+ *
Usage:
+ *
+ *
{@code
+ * {
+ *
+ *
+ * install(new AvajeInjectModule());
+ *
+ * }
+ *
+ * }
+ *
+ * Require calls are going to be resolved by Avaje inject now.
+ *
+ * @author josiah
+ * @since 3.0.0
+ */
+public class AvajeInjectModule implements Extension {
+
+ private final BeanScopeBuilder beanScope;
+
+ public static AvajeInjectModule of() {
+ return new AvajeInjectModule(BeanScope.builder());
+ }
+
+ public static AvajeInjectModule of(BeanScopeBuilder beanScope) {
+ return new AvajeInjectModule(beanScope);
+ }
+
+ AvajeInjectModule(BeanScopeBuilder beanScope) {
+ this.beanScope = beanScope;
+ }
+
+ @Override
+ public void install(Jooby application) throws Exception {
+
+ application
+ .getServices()
+ .entrySet()
+ .forEach(
+ e -> {
+ final var key = e.getKey();
+ beanScope.provideDefault(key.getName(), key.getType(), e::getValue);
+ });
+ final var environment = application.getEnvironment();
+ beanScope.profiles(environment.getActiveNames().toArray(String[]::new));
+ beanScope.propertyPlugin(new JoobyPropertyPlugin(environment.getConfig()));
+
+ application.registry(new AvajeInjectRegistry(beanScope.build()));
+ }
+}
diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectRegistry.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectRegistry.java
new file mode 100644
index 0000000000..6123bbba70
--- /dev/null
+++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectRegistry.java
@@ -0,0 +1,42 @@
+package io.jooby.avaje.inject;
+
+import java.util.NoSuchElementException;
+
+import io.avaje.inject.BeanScope;
+import io.jooby.Registry;
+import io.jooby.ServiceKey;
+import io.jooby.exception.RegistryException;
+
+class AvajeInjectRegistry implements Registry {
+
+ private final BeanScope beanScope;
+
+ public AvajeInjectRegistry(BeanScope beanScope) {
+ this.beanScope = beanScope;
+ }
+
+ @Override
+ public T require(Class type) throws RegistryException {
+ try {
+ return beanScope.get(type);
+ } catch (NoSuchElementException e) {
+ ServiceKey key = ServiceKey.key(type);
+ throw new RegistryException("Provisioning of `" + key + "` resulted in exception", e);
+ }
+ }
+
+ @Override
+ public T require(Class type, String name) throws RegistryException {
+ try {
+ return beanScope.get(type, name);
+ } catch (NoSuchElementException e) {
+ ServiceKey key = ServiceKey.key(type, name);
+ throw new RegistryException("Provisioning of `" + key + "` resulted in exception", e);
+ }
+ }
+
+ @Override
+ public T require(ServiceKey key) throws RegistryException {
+ return require(key.getType(), key.getName());
+ }
+}
diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java
new file mode 100644
index 0000000000..df6ef1389c
--- /dev/null
+++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java
@@ -0,0 +1,31 @@
+package io.jooby.avaje.inject;
+
+import java.util.Optional;
+
+import com.typesafe.config.Config;
+
+import io.avaje.inject.spi.PropertyRequiresPlugin;
+
+public class JoobyPropertyPlugin implements PropertyRequiresPlugin {
+
+ private final Config config;
+
+ public JoobyPropertyPlugin(Config config) {
+ this.config = config;
+ }
+
+ @Override
+ public Optional get(String property) {
+ return Optional.ofNullable(config.getString(property));
+ }
+
+ @Override
+ public boolean contains(String property) {
+ return config.hasPath(property);
+ }
+
+ @Override
+ public boolean equalTo(String property, String value) {
+ return config.getString(property).equals(value);
+ }
+}
diff --git a/modules/jooby-avaje-jsonb/pom.xml b/modules/jooby-avaje-jsonb/pom.xml
index 6a81da793d..78a168ccfd 100644
--- a/modules/jooby-avaje-jsonb/pom.xml
+++ b/modules/jooby-avaje-jsonb/pom.xml
@@ -24,6 +24,12 @@
avaje-jsonb
+
+ io.avaje
+ avaje-jsonb-generator
+ provided
+
+
io.jooby
diff --git a/modules/jooby-bom/pom.xml b/modules/jooby-bom/pom.xml
index 88f73d14ff..97c5517d53 100644
--- a/modules/jooby-bom/pom.xml
+++ b/modules/jooby-bom/pom.xml
@@ -29,6 +29,11 @@
jooby
${project.version}
+
+ io.jooby
+ jooby-avaje-inject
+ ${project.version}
+
io.jooby
jooby-avaje-jsonb
diff --git a/modules/pom.xml b/modules/pom.xml
index b1144713ea..9438c2db27 100644
--- a/modules/pom.xml
+++ b/modules/pom.xml
@@ -64,6 +64,7 @@
jooby-quartz
jooby-awssdk-v1
+ jooby-avaje-inject
jooby-guice
jooby-commons-email
diff --git a/pom.xml b/pom.xml
index 2894788bad..828bb6ff10 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,6 +47,7 @@
1.4.3
+ 9.12
7.0.0
@@ -673,6 +674,19 @@
jackson-datatype-hibernate5
${jackson.version}
+
+
+
+ io.avaje
+ avaje-inject
+ ${avaje-inject.version}
+
+
+
+ io.avaje
+ avaje-inject-generator
+ ${avaje-inject.version}
+
@@ -681,6 +695,12 @@
${avaje-jsonb.version}
+
+ io.avaje
+ avaje-jsonb-generator
+ ${avaje-jsonb.version}
+
+
org.freemarker
From 0cc57d4afd60a01b9dd20473f879510b386f943f Mon Sep 17 00:00:00 2001
From: Josiah Noel <32279667+SentryMan@users.noreply.github.com>
Date: Wed, 24 Apr 2024 18:35:17 -0400
Subject: [PATCH 02/12] add config as a bean
---
.../src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
index c5428f4f5b..1ffe49bc5e 100644
--- a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
+++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
@@ -5,6 +5,8 @@
*/
package io.jooby.avaje.inject;
+import com.typesafe.config.Config;
+
import io.avaje.inject.BeanScope;
import io.avaje.inject.BeanScopeBuilder;
import io.jooby.Extension;
@@ -62,6 +64,7 @@ public void install(Jooby application) throws Exception {
final var environment = application.getEnvironment();
beanScope.profiles(environment.getActiveNames().toArray(String[]::new));
beanScope.propertyPlugin(new JoobyPropertyPlugin(environment.getConfig()));
+ beanScope.bean(Config.class, environment.getConfig());
application.registry(new AvajeInjectRegistry(beanScope.build()));
}
From 6901c61b0ef3094efe76bb3dd67373e949d0b92d Mon Sep 17 00:00:00 2001
From: Josiah Noel <32279667+SentryMan@users.noreply.github.com>
Date: Wed, 24 Apr 2024 18:41:11 -0400
Subject: [PATCH 03/12] check for existence
---
.../main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java
index df6ef1389c..308d5412de 100644
--- a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java
+++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java
@@ -1,5 +1,6 @@
package io.jooby.avaje.inject;
+import java.util.Objects;
import java.util.Optional;
import com.typesafe.config.Config;
@@ -26,6 +27,6 @@ public boolean contains(String property) {
@Override
public boolean equalTo(String property, String value) {
- return config.getString(property).equals(value);
+ return Objects.equals(config.getString(property), value);
}
}
From 55d3098ad3ded6122eb1b9cec34bb7801efc14c4 Mon Sep 17 00:00:00 2001
From: Josiah Noel <32279667+SentryMan@users.noreply.github.com>
Date: Wed, 24 Apr 2024 18:43:44 -0400
Subject: [PATCH 04/12] Create module-info.java
---
.../src/main/java/module-info.java | 13 +++++++++++++
1 file changed, 13 insertions(+)
create mode 100644 modules/jooby-avaje-inject/src/main/java/module-info.java
diff --git a/modules/jooby-avaje-inject/src/main/java/module-info.java b/modules/jooby-avaje-inject/src/main/java/module-info.java
new file mode 100644
index 0000000000..341614c740
--- /dev/null
+++ b/modules/jooby-avaje-inject/src/main/java/module-info.java
@@ -0,0 +1,13 @@
+/*
+ * Jooby https://jooby.io
+ * Apache License Version 2.0 https://jooby.io/LICENSE.txt
+ * Copyright 2014 Edgar Espina
+ */
+/** Avaje Inject module. */
+module io.jooby.avaje.inject {
+ exports io.jooby.avaje.inject;
+
+ requires transitive io.jooby;
+ requires transitive typesafe.config;
+ requires transitive io.avaje.inject;
+}
From ce77eb4bbba7826f6d31504f5c1794a3786ca1b7 Mon Sep 17 00:00:00 2001
From: Josiah Noel <32279667+SentryMan@users.noreply.github.com>
Date: Thu, 25 Apr 2024 09:59:10 -0400
Subject: [PATCH 05/12] fix jooby beans not being singleton
---
.../src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
index 1ffe49bc5e..c6f6410f2b 100644
--- a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
+++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
@@ -59,7 +59,7 @@ public void install(Jooby application) throws Exception {
.forEach(
e -> {
final var key = e.getKey();
- beanScope.provideDefault(key.getName(), key.getType(), e::getValue);
+ beanScope.provideDefault(key.getName(), key.getType(), e.getValue()::get);
});
final var environment = application.getEnvironment();
beanScope.profiles(environment.getActiveNames().toArray(String[]::new));
From d9e6a985e0dbc7f24a1a58b87e59e9a3326643ff Mon Sep 17 00:00:00 2001
From: Josiah Noel <32279667+SentryMan@users.noreply.github.com>
Date: Thu, 25 Apr 2024 10:10:03 -0400
Subject: [PATCH 06/12] follow PR comment
---
.../main/java/io/jooby/avaje/inject/AvajeInjectModule.java | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
index c6f6410f2b..5354ef2fac 100644
--- a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
+++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
@@ -59,7 +59,11 @@ public void install(Jooby application) throws Exception {
.forEach(
e -> {
final var key = e.getKey();
- beanScope.provideDefault(key.getName(), key.getType(), e.getValue()::get);
+ if (key.getName() == null) {
+ beanScope.provideDefault(key.getType(), e::getValue);
+ } else {
+ beanScope.bean(key.getName(), key.getType(), e.getValue());
+ }
});
final var environment = application.getEnvironment();
beanScope.profiles(environment.getActiveNames().toArray(String[]::new));
From 717711141f71067b0538a23d0343252ba09c10b8 Mon Sep 17 00:00:00 2001
From: Josiah Noel <32279667+SentryMan@users.noreply.github.com>
Date: Thu, 25 Apr 2024 11:10:50 -0400
Subject: [PATCH 07/12] allow @Named Property Injection
---
.../jooby/avaje/inject/AvajeInjectModule.java | 21 +++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
index 5354ef2fac..371e6bda87 100644
--- a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
+++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
@@ -5,6 +5,9 @@
*/
package io.jooby.avaje.inject;
+import java.util.List;
+import java.util.stream.Collectors;
+
import com.typesafe.config.Config;
import io.avaje.inject.BeanScope;
@@ -65,10 +68,24 @@ public void install(Jooby application) throws Exception {
beanScope.bean(key.getName(), key.getType(), e.getValue());
}
});
+
final var environment = application.getEnvironment();
beanScope.profiles(environment.getActiveNames().toArray(String[]::new));
- beanScope.propertyPlugin(new JoobyPropertyPlugin(environment.getConfig()));
- beanScope.bean(Config.class, environment.getConfig());
+
+ // configuration properties
+ final var config = environment.getConfig();
+ beanScope.propertyPlugin(new JoobyPropertyPlugin(config));
+ beanScope.bean(Config.class, config);
+
+ for (var entry : config.entrySet()) {
+ String name = entry.getKey();
+ Object value = entry.getValue().unwrapped();
+
+ if (value instanceof List> values) {
+ value = values.stream().map(Object::toString).collect(Collectors.joining(","));
+ }
+ beanScope.bean(name, String.class, value.toString());
+ }
application.registry(new AvajeInjectRegistry(beanScope.build()));
}
From 8c761905bbad68622d58dc9e2566bf64e40793e0 Mon Sep 17 00:00:00 2001
From: Josiah Noel <32279667+SentryMan@users.noreply.github.com>
Date: Thu, 25 Apr 2024 11:15:58 -0400
Subject: [PATCH 08/12] follow property pr comments
---
.../main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java
index 308d5412de..246ed35665 100644
--- a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java
+++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/JoobyPropertyPlugin.java
@@ -27,6 +27,6 @@ public boolean contains(String property) {
@Override
public boolean equalTo(String property, String value) {
- return Objects.equals(config.getString(property), value);
+ return config.hasPath(property) && Objects.equals(config.getString(property), value);
}
}
From 84f73f13f4347e4160cb1d009ed473c23ddc511b Mon Sep 17 00:00:00 2001
From: Josiah Noel <32279667+SentryMan@users.noreply.github.com>
Date: Thu, 25 Apr 2024 11:25:02 -0400
Subject: [PATCH 09/12] fix comment
---
.../src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
index 371e6bda87..fa310bf61f 100644
--- a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
+++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
@@ -26,7 +26,7 @@
* {
*
*
- * install(new AvajeInjectModule());
+ * install(AvajeInjectModule.of());
*
* }
*
From 3c616fddb745a1ccdb1fd23eb7dca84ef4f9f3d0 Mon Sep 17 00:00:00 2001
From: Josiah Noel <32279667+SentryMan@users.noreply.github.com>
Date: Thu, 25 Apr 2024 11:26:50 -0400
Subject: [PATCH 10/12] late init
---
.../main/java/io/jooby/avaje/inject/AvajeInjectModule.java | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
index fa310bf61f..7ac6f62a3f 100644
--- a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
+++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java
@@ -53,6 +53,11 @@ public static AvajeInjectModule of(BeanScopeBuilder beanScope) {
this.beanScope = beanScope;
}
+ @Override
+ public boolean lateinit() {
+ return true;
+ }
+
@Override
public void install(Jooby application) throws Exception {
From f79d57c2ba800508b5fb9d06a08a8cabfdd37cb7 Mon Sep 17 00:00:00 2001
From: Josiah Noel <32279667+SentryMan@users.noreply.github.com>
Date: Fri, 26 Apr 2024 13:26:05 -0400
Subject: [PATCH 11/12] doc
---
docs/asciidoc/dependency-injection.adoc | 2 +-
docs/asciidoc/di-avaje.adoc | 136 ------------------------
docs/asciidoc/modules/avaje-inject.adoc | 127 ++++++++++++++++++++++
3 files changed, 128 insertions(+), 137 deletions(-)
delete mode 100644 docs/asciidoc/di-avaje.adoc
create mode 100644 docs/asciidoc/modules/avaje-inject.adoc
diff --git a/docs/asciidoc/dependency-injection.adoc b/docs/asciidoc/dependency-injection.adoc
index 93b3f01ae0..af2d8da9d1 100644
--- a/docs/asciidoc/dependency-injection.adoc
+++ b/docs/asciidoc/dependency-injection.adoc
@@ -1,6 +1,6 @@
== Dependency Injection
-include::di-avaje.adoc[]
+include::modules/avaje-inject.adoc[]
include::di-dagger.adoc[]
diff --git a/docs/asciidoc/di-avaje.adoc b/docs/asciidoc/di-avaje.adoc
deleted file mode 100644
index 24823604b5..0000000000
--- a/docs/asciidoc/di-avaje.adoc
+++ /dev/null
@@ -1,136 +0,0 @@
-=== Avaje Inject
-
-1) Add Avaje Inject to your project
-
-[dependency, groupId="io.avaje", artifactId="avaje-inject", version="9.8"]
-.
-
-2) Configure annotation processor
-
-.Maven
-[source, xml, role = "primary"]
-----
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ...
-
-
-
- io.avaje
- avaje-inject-generator
- 9.8
-
-
-
-
-
-
-----
-
-.Gradle
-[source, kotlin, role = "secondary"]
-----
-plugins {
- id "org.jetbrains.kotlin.kapt" version "1.9.10"
-}
-
-dependencies {
- kapt 'io.avaje:avaje-inject-generator:9.8'
-}
-----
-
-3) Bootstrap Avaje from application:
-
-.Java
-[source, java, role = "primary"]
-----
-import static io.jooby.Jooby.runApp;
-
-public class App extends Jooby {
-
- {
- /** Avaje: */
- BeanScope beanScope = BeanScope.builder() <1>
- .build();
-
- MyService service = beanScope.get(MyService.class); <2>
-
- get("/", ctx -> {
- return service.doSomething();
- });
- }
-
- public static void main(String[] args) {
- runApp(args, App::new);
- }
-}
-----
-
-.Kotlin
-[source, kotlin, role = "secondary"]
-----
-import io.jooby.kt.runApp
-
-fun main(args: Array) {
- runApp(args) {
- val beanScope = BeanScope.builder() <1>
- .build()
-
- val service = beanScope.getMyService() <2>
-
- get("/") {
- service.doSomething()
- }
- }
-}
-----
-
-<1> Bootstrap avaje inject bean container
-<2> Use Avaje provided objects
-
-==== MVC routes
-
-Integration of MVC routes with Avaje is as simple as:
-
-.MVC and Avaje
-[source, java, role = "primary"]
-----
-
-import static io.jooby.Jooby.runApp;
-
-public class App extends Jooby {
-
- {
- /** Avaje: */
- BeanScope beanScope = BeanScope.builder() <1>
- .build();
-
- mvc(beanScope.get(MyController.class)); <2>
- }
-
- public static void main(String[] args) {
- runApp(args, App::new);
- }
-}
-----
-
-.Kotlin
-[source, kotlin, role = "secondary"]
-----
-import io.jooby.kt.runApp
-
-fun main(args: Array) {
- runApp(args) {
- val beanScope = BeanScope.builder() <1>
- .build()
-
- mvc(beanScope.get(MyController.class)) <2>
- }
-}
-----
-
-<1> Bootstrap Avaje bean container
-<2> Register MVC route provided by Avaje
diff --git a/docs/asciidoc/modules/avaje-inject.adoc b/docs/asciidoc/modules/avaje-inject.adoc
new file mode 100644
index 0000000000..17a0721983
--- /dev/null
+++ b/docs/asciidoc/modules/avaje-inject.adoc
@@ -0,0 +1,127 @@
+=== Avaje Inject
+
+1) Add Avaje Inject to your project
+
+[dependency, groupId="io.jooby", artifactId="jooby-avaje-inject", version="1.1.0"]
+.
+
+
+2) Install Avaje Inject:
+
+.Installing Avaje Inject
+[source,java,role = "primary"]
+----
+public class App extends Jooby {
+
+ {
+ install(AvajeInjectModule.of()); <1>
+
+ get("/", ctx -> {
+ MyService service = require(MyService.class); <2>
+ return service.doSomething();
+ });
+}
+
+ public static void main(String[] args) {
+ runApp(args, App::new);
+ }
+}
+----
+
+.Kotlin
+[source, kotlin, role = "secondary"]
+----
+fun main(args: Array) {
+ runApp(args) {
+ install(AvajeInjectModule.of()) <1>
+
+ get ("/") {
+ val service = require(MyService::class) <2>
+ service.doSomething()
+ }
+ }
+}
+----
+
+<1> Install Avaje Inject module
+<2> The javadoc:Jooby[require, java.lang.Class] call is now resolved by Avaje Inject
+
+==== Property Injection
+
+Configuration properties can be injected using the `@Named` annotation. As Avaje checks beans at compile time, `@InjectModule(requires={String.class})`:
+
+.application.conf
+[source, bash]
+----
+currency = USD
+----
+
+.Java
+[source,java,role="primary"]
+----
+@Singleton
+public class BillingService {
+
+ @Inject
+ public BillingService(@Named("currency") String currency) {
+ ...
+ }
+
+}
+----
+
+.Kotlin
+[source,kotlin,role="secondary"]
+----
+@Singleton
+class BillingService @Inject constructor(@Named("currency") currency: String) {
+ ...
+}
+----
+
+==== MVC routes
+
+Avaje Inject will also provisioning MVC routes
+
+.MVC and Avaje Inject
+[source,java,role = "primary"]
+----
+import io.jooby.Avaje Inject.AvajeInjectModule;
+import io.jooby.kt.runApp
+
+public class App extends Jooby {
+
+ {
+ install(AvajeInjectModule.of()); <1>
+
+ mvc(MyController.class); <2>
+ }
+
+ public static void main(String[] args) {
+ runApp(args, App::new);
+ }
+}
+----
+
+.Kotlin
+[source, kotlin, role = "secondary"]
+----
+import io.jooby.di.AvajeInjectModule
+import io.jooby.kt.runApp
+
+fun main(args: Array) {
+ runApp(args) {
+ install(AvajeInjectModule.of()) <1>
+
+ mvc(MyController::class) <2>
+ }
+}
+----
+
+<1> Install Avaje Inject module
+<2> Register a MVC route
+
+The lifecycle of `MyController` is now managed by Avaje Inject.
+
+In Avaje Inject, the dependency graph is typically validated when the application compiles. As beans provided by Jooby Modules are registered at runtime, you must add `@InjectModules(requires={String.class, ...})` to inform the avaje processor that these beans are provided at runtime.
+
From 95776559917f4ddb1e4cfa8faff1ab1b3228b409 Mon Sep 17 00:00:00 2001
From: Josiah Noel <32279667+SentryMan@users.noreply.github.com>
Date: Fri, 26 Apr 2024 13:26:56 -0400
Subject: [PATCH 12/12] Update avaje-inject.adoc
---
docs/asciidoc/modules/avaje-inject.adoc | 6 ------
1 file changed, 6 deletions(-)
diff --git a/docs/asciidoc/modules/avaje-inject.adoc b/docs/asciidoc/modules/avaje-inject.adoc
index 17a0721983..490f68541e 100644
--- a/docs/asciidoc/modules/avaje-inject.adoc
+++ b/docs/asciidoc/modules/avaje-inject.adoc
@@ -86,9 +86,6 @@ Avaje Inject will also provisioning MVC routes
.MVC and Avaje Inject
[source,java,role = "primary"]
----
-import io.jooby.Avaje Inject.AvajeInjectModule;
-import io.jooby.kt.runApp
-
public class App extends Jooby {
{
@@ -106,9 +103,6 @@ public class App extends Jooby {
.Kotlin
[source, kotlin, role = "secondary"]
----
-import io.jooby.di.AvajeInjectModule
-import io.jooby.kt.runApp
-
fun main(args: Array) {
runApp(args) {
install(AvajeInjectModule.of()) <1>