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>