diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/pom.xml b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/pom.xml
new file mode 100644
index 00000000..658e2b51
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/pom.xml
@@ -0,0 +1,101 @@
+
+
+ 4.0.0
+
+ ru.otus
+ application
+ 0.0.1-SNAPSHOT
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.3.3.RELEASE
+
+
+
+ UTF-8
+ 11
+ 11
+
+ 3.0.0-M3
+ 3.3.9
+
+ 0.0.1-SNAPSHOT
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+ ru.otus
+ messager-starter
+ ${messager-starter.version}
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+
+
+
+
+ maven-enforcer-plugin
+ ${maven-enforcer-plugin.version}
+
+
+ enforce-maven
+
+ enforce
+
+
+
+
+
+ ${minimal.maven.version}
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/Demo.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/Demo.java
new file mode 100644
index 00000000..610b4169
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/Demo.java
@@ -0,0 +1,17 @@
+package ru.otus.mainpackage;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import ru.otus.mainpackage.configs.YamlProps;
+
+//http://localhost:8080/actuator/health
+
+@SpringBootApplication
+@EnableConfigurationProperties(YamlProps.class)
+public class Demo {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Demo.class, args);
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/configs/Localization.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/configs/Localization.java
new file mode 100644
index 00000000..9ac25c3d
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/configs/Localization.java
@@ -0,0 +1,17 @@
+package ru.otus.mainpackage.configs;
+
+import org.springframework.context.MessageSource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.support.ReloadableResourceBundleMessageSource;
+
+@Configuration
+public class Localization {
+ @Bean
+ public MessageSource messageSource() {
+ var ms = new ReloadableResourceBundleMessageSource();
+ ms.setBasename("classpath:/il8n/bundle");
+ ms.setDefaultEncoding("UTF-8");
+ return ms;
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/configs/YamlProps.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/configs/YamlProps.java
new file mode 100644
index 00000000..e491793b
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/configs/YamlProps.java
@@ -0,0 +1,28 @@
+package ru.otus.mainpackage.configs;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.util.Locale;
+
+@ConfigurationProperties(prefix = "application")
+public class YamlProps {
+
+ private String message;
+ private Locale locale;
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public Locale getLocale() {
+ return locale;
+ }
+
+ public void setLocale(Locale locale) {
+ this.locale = locale;
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/Greeting.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/Greeting.java
new file mode 100644
index 00000000..a8c5db1b
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/Greeting.java
@@ -0,0 +1,7 @@
+package ru.otus.mainpackage.welcome;
+
+import java.util.Map;
+
+public interface Greeting {
+ Map sayHello(String name);
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/GreetingController.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/GreetingController.java
new file mode 100644
index 00000000..0610eab6
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/GreetingController.java
@@ -0,0 +1,29 @@
+package ru.otus.mainpackage.welcome;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import ru.otus.mainpackage.configs.YamlProps;
+
+
+import java.util.Map;
+
+@RestController
+public class GreetingController {
+ private static final Logger logger = LoggerFactory.getLogger(GreetingController.class);
+ private final Greeting greeting;
+
+ public GreetingController(Greeting greeting, YamlProps props) {
+ this.greeting = greeting;
+ logger.info("ATTENTION! props.getMessage(): {}", props.getMessage());
+ }
+
+ //http://localhost:8080/hello?name=ddd
+ @GetMapping("/hello")
+ public Map sayHello(@RequestParam(name="name") String name) {
+ return this.greeting.sayHello(name);
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/GreetingControllerRstyle.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/GreetingControllerRstyle.java
new file mode 100644
index 00000000..6ccf2ffb
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/GreetingControllerRstyle.java
@@ -0,0 +1,27 @@
+package ru.otus.mainpackage.welcome;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+@RestController
+public class GreetingControllerRstyle {
+ private static final Logger logger = LoggerFactory.getLogger(GreetingControllerRstyle.class);
+
+ private final Greeting greeting;
+
+ public GreetingControllerRstyle(Greeting greeting) {
+ logger.info("Я НАСТОЯЩИЙ БИН!!!");
+ this.greeting = greeting;
+ }
+
+ //http://localhost:8080/hello/jone
+ @GetMapping(value="/hello/{name}")
+ public Map sayHello(@PathVariable("name") String name) {
+ return this.greeting.sayHello(name);
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/GreetingService.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/GreetingService.java
new file mode 100644
index 00000000..b563310a
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/GreetingService.java
@@ -0,0 +1,17 @@
+package ru.otus.mainpackage.welcome;
+
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class GreetingService implements Greeting {
+
+ @Override
+ public Map sayHello(String name) {
+ Map map = new HashMap<>();
+ map.put(name, "Hello, " + name);
+ return map;
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/LocalHello.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/LocalHello.java
new file mode 100644
index 00000000..d265f8b9
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/welcome/LocalHello.java
@@ -0,0 +1,29 @@
+package ru.otus.mainpackage.welcome;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.MessageSource;
+import org.springframework.stereotype.Component;
+import ru.otus.mainpackage.configs.YamlProps;
+
+import javax.annotation.PostConstruct;
+
+@Component
+public class LocalHello {
+ private static final Logger logger = LoggerFactory.getLogger(LocalHello.class);
+
+ private final MessageSource messageSource;
+ private final YamlProps props;
+
+ public LocalHello(MessageSource messageSource, YamlProps props) {
+ this.messageSource = messageSource;
+ this.props = props;
+ }
+
+ //!!! Вообще, PostConstruct - это плохая практика !!!
+ @PostConstruct
+ public void printHello() {
+ var message = messageSource.getMessage("hello.user", new String[]{"Ivan"}, props.getLocale());
+ logger.info("Localization:{}", message);
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/сommandlinerunners/PreparationDev.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/сommandlinerunners/PreparationDev.java
new file mode 100644
index 00000000..88e908f3
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/ru/otus/mainpackage/сommandlinerunners/PreparationDev.java
@@ -0,0 +1,28 @@
+package ru.otus.mainpackage.сommandlinerunners;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+import ru.otus.Messager;
+
+import java.util.Arrays;
+
+
+@Component
+public class PreparationDev implements CommandLineRunner {
+ private static final Logger logger = LoggerFactory.getLogger(PreparationDev.class);
+
+ private final Messager messager;
+
+ public PreparationDev(Messager messager) {
+ this.messager = messager;
+ }
+
+ @Override
+ public void run(String... args) {
+ logger.info("DEV mode!!! Что-то настравиваем и подготавливаем, параметры: {} ", Arrays.toString(args));
+ logger.info("message from Messager:{}", messager.sayMessage());
+ //args парметры, котрые могут быть переданы в Main
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/wrongPackage/PreparationUnKnown.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/wrongPackage/PreparationUnKnown.java
new file mode 100644
index 00000000..4900dfb6
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/java/wrongPackage/PreparationUnKnown.java
@@ -0,0 +1,17 @@
+package wrongPackage;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+//Этот компонент не будет найден, т.к. нарушена иерархия пакетов
+@Component
+public class PreparationUnKnown implements CommandLineRunner {
+ private static final Logger logger = LoggerFactory.getLogger(PreparationUnKnown.class);
+
+ @Override
+ public void run(String... args) throws Exception {
+ logger.info("Это не увидим никогда");
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/resources/application.yml b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/resources/application.yml
new file mode 100644
index 00000000..f2e30c2c
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/resources/application.yml
@@ -0,0 +1,15 @@
+server:
+ port: 8080
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: info, health, beans
+
+application:
+ message: "Test Props msg"
+ locale: ru_RU
+
+messager:
+ message: "Hello from Messager"
\ No newline at end of file
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/resources/il8n/bundle_en.properties b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/resources/il8n/bundle_en.properties
new file mode 100644
index 00000000..e3bada4f
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/resources/il8n/bundle_en.properties
@@ -0,0 +1 @@
+hello.user="Hello, {0}"!
\ No newline at end of file
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/resources/il8n/bundle_ru_RU.properties b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/resources/il8n/bundle_ru_RU.properties
new file mode 100644
index 00000000..20439324
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/resources/il8n/bundle_ru_RU.properties
@@ -0,0 +1 @@
+hello.user="Привет, {0}"!
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/resources/logback.xml b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/resources/logback.xml
new file mode 100644
index 00000000..6fb07ce3
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/test/java/ru/otus/mainpackage/welcome/GreetingControllerTest.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/test/java/ru/otus/mainpackage/welcome/GreetingControllerTest.java
new file mode 100644
index 00000000..73d586a5
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/application/src/test/java/ru/otus/mainpackage/welcome/GreetingControllerTest.java
@@ -0,0 +1,62 @@
+package ru.otus.mainpackage.welcome;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.web.servlet.MockMvc;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+
+
+@WebMvcTest({GreetingController.class, GreetingControllerRstyle.class})
+public class GreetingControllerTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @MockBean
+ private Greeting greeting;
+
+ @Test
+ public void sayHelloTest() throws Exception {
+ String name = "Mr.Test";
+ Map map = new HashMap<>();
+ map.put(name, "Hello, " + name);
+ String expectedResult = "{\"Mr.Test\":\"Hello, Mr.Test\"}";
+
+ when(greeting.sayHello(name)).thenReturn(map);
+ MockHttpServletResponse result = mockMvc.perform(get(String.format("/hello?name=%s", name)))
+ .andReturn()
+ .getResponse();
+
+ verify(greeting, times(1)).sayHello(name);
+ System.out.println();
+ assertThat(result.getContentAsString()).isEqualTo(expectedResult);
+ }
+
+ @Test
+ public void sayHelloTestMock() throws Exception {
+ String name = "Mr.Test";
+ Map map = new HashMap<>();
+ map.put(name, "Hello, " + name);
+ String expectedResult = "{\"Mr.Test\":\"Hello, Mr.Test\"}";
+
+ when(greeting.sayHello(name)).thenReturn(map);
+ MockHttpServletResponse result = mockMvc.perform(get(String.format("/hello/%s", name)))
+ .andReturn()
+ .getResponse();
+
+ verify(greeting, times(1)).sayHello(name);
+ System.out.println();
+ assertThat(result.getContentAsString()).isEqualTo(expectedResult);
+ }
+}
\ No newline at end of file
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/messager-starter/pom.xml b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager-starter/pom.xml
new file mode 100644
index 00000000..354f87eb
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager-starter/pom.xml
@@ -0,0 +1,75 @@
+
+
+ 4.0.0
+
+ ru.otus
+ messager-starter
+ 0.0.1-SNAPSHOT
+
+
+ UTF-8
+ 11
+ 11
+
+ 3.0.0-M3
+ 3.3.9
+
+ 3.2.1
+
+ 2.3.3.RELEASE
+ 0.0.1-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+ ${spring-boot-starter.version}
+
+
+ org.slf4j
+ jul-to-slf4j
+
+
+
+
+
+ ru.otus
+ messager
+ ${messager.version}
+
+
+
+
+
+
+
+ maven-enforcer-plugin
+ ${maven-enforcer-plugin.version}
+
+
+ enforce-maven
+
+ enforce
+
+
+
+
+
+ ${minimal.maven.version}
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ ${maven-shade-plugin.version}
+
+
+
+
\ No newline at end of file
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/messager-starter/src/main/java/ru/otus/MessagerAutoConfiguration.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager-starter/src/main/java/ru/otus/MessagerAutoConfiguration.java
new file mode 100644
index 00000000..561b0b46
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager-starter/src/main/java/ru/otus/MessagerAutoConfiguration.java
@@ -0,0 +1,38 @@
+package ru.otus;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+@ConditionalOnClass(Messager.class)
+@EnableConfigurationProperties(Props.class)
+public class MessagerAutoConfiguration {
+ private static final Logger logger = LoggerFactory.getLogger(MessagerAutoConfiguration.class);
+
+ private final Props props;
+
+ public MessagerAutoConfiguration(Props props) {
+ this.props = props;
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public MessagerConfig messagerConfig() {
+ String message = props.getMessage() == null ? "default message" : props.getMessage();
+ logger.info("AutoConfig. creating MessagerConfig, default message:{}", message);
+ return new MessagerConfig(message);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public Messager messager(MessagerConfig messagerConfig) {
+ logger.info("AutoConfig. creating Messager");
+ return new Messager(messagerConfig);
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/messager-starter/src/main/java/ru/otus/Props.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager-starter/src/main/java/ru/otus/Props.java
new file mode 100644
index 00000000..12de712a
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager-starter/src/main/java/ru/otus/Props.java
@@ -0,0 +1,17 @@
+package ru.otus;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix="messager")
+public class Props {
+
+ private String message;
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/messager-starter/src/main/resources/META-INF/spring.factories b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager-starter/src/main/resources/META-INF/spring.factories
new file mode 100644
index 00000000..a1076bcb
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager-starter/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+ ru.otus.MessagerAutoConfiguration
\ No newline at end of file
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/messager/pom.xml b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager/pom.xml
new file mode 100644
index 00000000..bc328100
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager/pom.xml
@@ -0,0 +1,51 @@
+
+
+ 4.0.0
+
+ ru.otus
+ messager
+ 0.0.1-SNAPSHOT
+
+
+ UTF-8
+ 11
+ 11
+
+ 3.0.0-M3
+ 3.3.9
+
+ 3.2.1
+
+
+
+
+
+ maven-enforcer-plugin
+ ${maven-enforcer-plugin.version}
+
+
+ enforce-maven
+
+ enforce
+
+
+
+
+
+ ${minimal.maven.version}
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ ${maven-shade-plugin.version}
+
+
+
+
\ No newline at end of file
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/messager/src/main/java/ru/otus/Messager.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager/src/main/java/ru/otus/Messager.java
new file mode 100644
index 00000000..acea0270
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager/src/main/java/ru/otus/Messager.java
@@ -0,0 +1,13 @@
+package ru.otus;
+
+public class Messager {
+ private final MessagerConfig config;
+
+ public Messager(MessagerConfig config) {
+ this.config = config;
+ }
+
+ public String sayMessage() {
+ return config.getMessage();
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-demo/messager/src/main/java/ru/otus/MessagerConfig.java b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager/src/main/java/ru/otus/MessagerConfig.java
new file mode 100644
index 00000000..2405d3ea
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-demo/messager/src/main/java/ru/otus/MessagerConfig.java
@@ -0,0 +1,13 @@
+package ru.otus;
+
+public class MessagerConfig {
+ private final String message;
+
+ public MessagerConfig(String message) {
+ this.message = message;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/pom.xml b/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/pom.xml
new file mode 100644
index 00000000..34768b6e
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/pom.xml
@@ -0,0 +1,40 @@
+
+
+ 4.0.0
+
+ ru.otus
+ springBoot-hello
+ 0.0.1-SNAPSHOT
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.3.3.RELEASE
+
+
+
+ UTF-8
+ 11
+ 11
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
\ No newline at end of file
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/src/main/java/ru/otus/HelloWorldDemo.java b/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/src/main/java/ru/otus/HelloWorldDemo.java
new file mode 100644
index 00000000..e7a3a951
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/src/main/java/ru/otus/HelloWorldDemo.java
@@ -0,0 +1,20 @@
+package ru.otus;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+
+@SpringBootApplication
+public class HelloWorldDemo {
+ public static void main(String[] args) {
+ var context = SpringApplication.run(HelloWorldDemo.class, args);
+ var welcome = context.getBean(Welcome.class);
+ welcome.sayHello();
+ }
+
+ @Bean
+ public Welcome speaker() {
+ return () -> System.out.println("Hello, World");
+ }
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/src/main/java/ru/otus/Welcome.java b/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/src/main/java/ru/otus/Welcome.java
new file mode 100644
index 00000000..4c21fa8a
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/src/main/java/ru/otus/Welcome.java
@@ -0,0 +1,6 @@
+package ru.otus;
+
+@FunctionalInterface
+public interface Welcome {
+ void sayHello();
+}
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/src/main/resources/application.properties b/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/src/main/resources/application.properties
new file mode 100644
index 00000000..e69de29b
diff --git a/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/src/main/resources/banner.txt b/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/src/main/resources/banner.txt
new file mode 100644
index 00000000..7ab92240
--- /dev/null
+++ b/2020-08/spring-04-springboot/spring-04-springboot-solution/springBoot-hello/src/main/resources/banner.txt
@@ -0,0 +1 @@
+Hell
\ No newline at end of file