From 508a04086767d06b2e6eb32424114c4510569b1f Mon Sep 17 00:00:00 2001 From: Kai Moritz Date: Fri, 20 Nov 2020 21:40:28 +0100 Subject: [PATCH] Demonstration of multiple dynamically instantiated beans --- pom.xml | 6 +++ .../demos/multiplebeans/HomeController.java | 23 +++++++++ .../MultipleBeansApplication.java | 10 +++- ...pleBeansApplicationContextInitializer.java | 24 +++++++++ ...MultipleBeansEnvironmentPostProcessor.java | 29 +++++++++++ .../demos/multiplebeans/SiteController.java | 26 ++++++++++ src/main/resources/META-INF/spring.factories | 2 + src/main/resources/application.properties | 1 - src/main/resources/application.yml | 2 + src/main/resources/templates/400.html | 15 ++++++ src/main/resources/templates/error.html | 51 +++++++++++++++++++ src/main/resources/templates/home.html | 25 +++++++++ src/main/resources/templates/layout.html | 20 ++++++++ src/main/resources/templates/site.html | 23 +++++++++ 14 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 src/main/java/de/juplo/demos/multiplebeans/HomeController.java create mode 100644 src/main/java/de/juplo/demos/multiplebeans/MultipleBeansApplicationContextInitializer.java create mode 100644 src/main/java/de/juplo/demos/multiplebeans/MultipleBeansEnvironmentPostProcessor.java create mode 100644 src/main/java/de/juplo/demos/multiplebeans/SiteController.java create mode 100644 src/main/resources/META-INF/spring.factories delete mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/templates/400.html create mode 100644 src/main/resources/templates/error.html create mode 100644 src/main/resources/templates/home.html create mode 100644 src/main/resources/templates/layout.html create mode 100644 src/main/resources/templates/site.html diff --git a/pom.xml b/pom.xml index c5a9621..0c9e4dc 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,12 @@ lombok true + + org.webjars + bootstrap + 4.5.2 + runtime + org.springframework.boot spring-boot-starter-test diff --git a/src/main/java/de/juplo/demos/multiplebeans/HomeController.java b/src/main/java/de/juplo/demos/multiplebeans/HomeController.java new file mode 100644 index 0000000..5a488cf --- /dev/null +++ b/src/main/java/de/juplo/demos/multiplebeans/HomeController.java @@ -0,0 +1,23 @@ +package de.juplo.demos.multiplebeans; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.Controller; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@RequiredArgsConstructor +public class HomeController implements Controller { + + private final String[] sites; + + + @Override + public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { + + ModelAndView mav = new ModelAndView("home"); + mav.addObject("sites", sites); + return mav; + } +} diff --git a/src/main/java/de/juplo/demos/multiplebeans/MultipleBeansApplication.java b/src/main/java/de/juplo/demos/multiplebeans/MultipleBeansApplication.java index 618ba8e..16f82eb 100644 --- a/src/main/java/de/juplo/demos/multiplebeans/MultipleBeansApplication.java +++ b/src/main/java/de/juplo/demos/multiplebeans/MultipleBeansApplication.java @@ -1,13 +1,21 @@ package de.juplo.demos.multiplebeans; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; @SpringBootApplication public class MultipleBeansApplication { + @Bean("/") + public HomeController homeController(@Value("${juplo.sites}")String[] sites) { + + return new HomeController(sites); + } + + public static void main(String[] args) { SpringApplication.run(MultipleBeansApplication.class, args); } - } diff --git a/src/main/java/de/juplo/demos/multiplebeans/MultipleBeansApplicationContextInitializer.java b/src/main/java/de/juplo/demos/multiplebeans/MultipleBeansApplicationContextInitializer.java new file mode 100644 index 0000000..28f22df --- /dev/null +++ b/src/main/java/de/juplo/demos/multiplebeans/MultipleBeansApplicationContextInitializer.java @@ -0,0 +1,24 @@ +package de.juplo.demos.multiplebeans; + +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; + +@AllArgsConstructor +public class MultipleBeansApplicationContextInitializer + implements + ApplicationContextInitializer { + + private final String[] sites; + + + @Override + public void initialize(ConfigurableApplicationContext context) { + ConfigurableListableBeanFactory factory = context.getBeanFactory(); + for (String site : sites) { + SiteController controller = new SiteController(site, "Descrition of site " + site); + factory.registerSingleton("/" + site, controller); + } + } +} diff --git a/src/main/java/de/juplo/demos/multiplebeans/MultipleBeansEnvironmentPostProcessor.java b/src/main/java/de/juplo/demos/multiplebeans/MultipleBeansEnvironmentPostProcessor.java new file mode 100644 index 0000000..0e31555 --- /dev/null +++ b/src/main/java/de/juplo/demos/multiplebeans/MultipleBeansEnvironmentPostProcessor.java @@ -0,0 +1,29 @@ +package de.juplo.demos.multiplebeans; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.PropertySource; + +import java.util.Arrays; + +public class MultipleBeansEnvironmentPostProcessor implements EnvironmentPostProcessor { + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + String sites = null; + for (PropertySource source : environment.getPropertySources()) { + Object found = source.getProperty("juplo.sites"); + if (found != null) + sites = found.toString(); + } + + if (sites == null) + throw new IllegalArgumentException("Parameter juplo.sites is not set!"); + + application.addInitializers(new MultipleBeansApplicationContextInitializer( + Arrays.stream(sites.split(",")) + .map(site -> site.trim()) + .toArray(size -> new String[size]))); + } +} \ No newline at end of file diff --git a/src/main/java/de/juplo/demos/multiplebeans/SiteController.java b/src/main/java/de/juplo/demos/multiplebeans/SiteController.java new file mode 100644 index 0000000..99e1ece --- /dev/null +++ b/src/main/java/de/juplo/demos/multiplebeans/SiteController.java @@ -0,0 +1,26 @@ +package de.juplo.demos.multiplebeans; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.Controller; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@RequiredArgsConstructor +public class SiteController implements Controller { + + private final String name; + private final String description; + + + public ModelAndView handleRequest( + HttpServletRequest request, + HttpServletResponse response) throws Exception { + + ModelAndView mav = new ModelAndView("site"); + mav.addObject("name", name); + mav.addObject("description", description); + return mav; + } +} diff --git a/src/main/resources/META-INF/spring.factories b/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..cb8c09a --- /dev/null +++ b/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.env.EnvironmentPostProcessor=\ + de.juplo.demos.multiplebeans.MultipleBeansEnvironmentPostProcessor diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..01ec1b0 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,2 @@ +juplo: + sites: peter, ute, franz diff --git a/src/main/resources/templates/400.html b/src/main/resources/templates/400.html new file mode 100644 index 0000000..36ba0c0 --- /dev/null +++ b/src/main/resources/templates/400.html @@ -0,0 +1,15 @@ + + + + Testing Exception-Handling - Template for 400 + + + + +

Template for 400

+
+

EXCEPTION

+

Back to HOME

+
+ + diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html new file mode 100644 index 0000000..a5e8149 --- /dev/null +++ b/src/main/resources/templates/error.html @@ -0,0 +1,51 @@ + + + + XXX: ERROR + + + + +

XXX: ERROR

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StatusERROR.STATUS
ErrorERROR.ERROR
MessageERROR.MESSAGE
Request-IDERROR.REQUEST_ID
TimstampERROR.TIMESTAMP
PathERROR.PATH
Trace +
+
ERROR.TRACE
+
+
+

Back to HOME + + + diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html new file mode 100644 index 0000000..cb75a1d --- /dev/null +++ b/src/main/resources/templates/home.html @@ -0,0 +1,25 @@ + + + + Home + + + + +

Home

+
+ +
+
+

+ + This page links to the pages, that are served by the dynamically created beans. + +

+
+ + diff --git a/src/main/resources/templates/layout.html b/src/main/resources/templates/layout.html new file mode 100644 index 0000000..3ad68ed --- /dev/null +++ b/src/main/resources/templates/layout.html @@ -0,0 +1,20 @@ + + + + + + TITLE + + + + +
+
+

HEADER

+
BODY
+
+
+ + diff --git a/src/main/resources/templates/site.html b/src/main/resources/templates/site.html new file mode 100644 index 0000000..6ea90f5 --- /dev/null +++ b/src/main/resources/templates/site.html @@ -0,0 +1,23 @@ + + + + SITE-TEMPLATE + + + + +

SITE

+
+

DESCRIPTION

+
+
+

+ + Each site is defined in the configuration with name and description inside an array. + This demo shows, how to create multiple beans of the same type based on the configuration. + +

+
+
Back Home
+ + -- 2.20.1