diff --git a/2022-11/spring-07-avdanced-config/.gitignore b/2022-11/spring-07-avdanced-config/.gitignore
new file mode 100644
index 00000000..e62c33c2
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/.gitignore
@@ -0,0 +1,4 @@
+.idea/
+*.iml
+
+target/
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/.gitignore b/2022-11/spring-07-avdanced-config/application-events-demo/.gitignore
new file mode 100644
index 00000000..789ddc9e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/.gitignore
@@ -0,0 +1,32 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#other
+*.bat
+*/.idea
+*.iml
+*/target
+
+.idea
+*.iml
+target
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/README.md b/2022-11/spring-07-avdanced-config/application-events-demo/README.md
new file mode 100644
index 00000000..63e68847
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/README.md
@@ -0,0 +1,2 @@
+# application-events-demo
+Пример работы с событиями
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/pom.xml b/2022-11/spring-07-avdanced-config/application-events-demo/pom.xml
new file mode 100644
index 00000000..fcbb4339
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/pom.xml
@@ -0,0 +1,62 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.6
+
+
+
+ ru.otus.example
+ application-events-demo
+ 0.0.1-SNAPSHOT
+ application-events-demo
+ Application events demo
+
+
+ 11
+ 11
+ 11
+ 2.1.0
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+ org.springframework.shell
+ spring-shell-starter
+ ${spring.shell.version}
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/ApplicationEventsDemoApplication.java b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/ApplicationEventsDemoApplication.java
new file mode 100644
index 00000000..5b8d7ef3
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/ApplicationEventsDemoApplication.java
@@ -0,0 +1,26 @@
+package ru.otus.example.applicationeventsdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.event.ApplicationEventMulticaster;
+import org.springframework.context.event.SimpleApplicationEventMulticaster;
+import org.springframework.core.task.SimpleAsyncTaskExecutor;
+
+@SpringBootApplication
+public class ApplicationEventsDemoApplication {
+
+ //@Bean @Primary
+ //@Bean(name = "applicationEventMulticaster")
+ public ApplicationEventMulticaster applicationEventMulticaster() {
+ SimpleApplicationEventMulticaster eventMulticaster = new SimpleApplicationEventMulticaster();
+ eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());
+ return eventMulticaster;
+ }
+
+ public static void main(String[] args) {
+ SpringApplication.run(ApplicationEventsDemoApplication.class, args);
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/EventsPublisher.java b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/EventsPublisher.java
new file mode 100644
index 00000000..2274570a
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/EventsPublisher.java
@@ -0,0 +1,5 @@
+package ru.otus.example.applicationeventsdemo.events;
+
+public interface EventsPublisher {
+ void publish();
+}
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/HalfAGlassOfWaterEvent.java b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/HalfAGlassOfWaterEvent.java
new file mode 100644
index 00000000..22bab552
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/HalfAGlassOfWaterEvent.java
@@ -0,0 +1,15 @@
+package ru.otus.example.applicationeventsdemo.events;
+
+import lombok.Getter;
+import org.springframework.context.ApplicationEvent;
+
+public class HalfAGlassOfWaterEvent extends ApplicationEvent {
+
+ @Getter
+ private final String payload;
+
+ public HalfAGlassOfWaterEvent(Object source) {
+ super(source);
+ payload = "Осталось половина стакана воды!!!";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/HalfAGlassOfWaterEventPublisher.java b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/HalfAGlassOfWaterEventPublisher.java
new file mode 100644
index 00000000..a1186fcc
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/HalfAGlassOfWaterEventPublisher.java
@@ -0,0 +1,17 @@
+package ru.otus.example.applicationeventsdemo.events;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class HalfAGlassOfWaterEventPublisher implements EventsPublisher {
+
+ private final ApplicationEventPublisher publisher;
+
+ @Override
+ public void publish() {
+ publisher.publishEvent(new HalfAGlassOfWaterEvent(this));
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/NegativeRespondent.java b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/NegativeRespondent.java
new file mode 100644
index 00000000..ce6115c9
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/NegativeRespondent.java
@@ -0,0 +1,18 @@
+package ru.otus.example.applicationeventsdemo.events;
+
+import lombok.SneakyThrows;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+@Component
+public class NegativeRespondent implements ApplicationListener {
+
+ @SneakyThrows
+ @Override
+ public void onApplicationEvent(HalfAGlassOfWaterEvent halfAGlassOfWaterEvent) {
+ Thread.sleep(100);
+ System.out.println("Негативно настроенный слушатель");
+ System.out.println(String.format("- %s", halfAGlassOfWaterEvent.getPayload()));
+ System.out.println("- Какой ужас. Теперь он наполовину пуст!!!\n\n");
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/PositiveRespondent.java b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/PositiveRespondent.java
new file mode 100644
index 00000000..fb930f9e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/events/PositiveRespondent.java
@@ -0,0 +1,18 @@
+package ru.otus.example.applicationeventsdemo.events;
+
+import lombok.SneakyThrows;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PositiveRespondent {
+
+ @SneakyThrows
+ @EventListener
+ public void onApplicationEvent(HalfAGlassOfWaterEvent halfAGlassOfWaterEvent) {
+ Thread.sleep(100);
+ System.out.println("Позитивно настроенный слушатель");
+ System.out.println(String.format("- %s", halfAGlassOfWaterEvent.getPayload()));
+ System.out.println("- Ничего. Главное, что он наполовину полон!!!\n\n");
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/shell/ApplicationEventsCommands.java b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/shell/ApplicationEventsCommands.java
new file mode 100644
index 00000000..153a61ae
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/java/ru/otus/example/applicationeventsdemo/shell/ApplicationEventsCommands.java
@@ -0,0 +1,35 @@
+package ru.otus.example.applicationeventsdemo.shell;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.shell.Availability;
+import org.springframework.shell.standard.ShellComponent;
+import org.springframework.shell.standard.ShellMethod;
+import org.springframework.shell.standard.ShellMethodAvailability;
+import org.springframework.shell.standard.ShellOption;
+import ru.otus.example.applicationeventsdemo.events.EventsPublisher;
+
+@ShellComponent
+@RequiredArgsConstructor
+public class ApplicationEventsCommands {
+
+ private final EventsPublisher eventsPublisher;
+
+ private String userName;
+
+ @ShellMethod(value = "Login command", key = {"l", "login"})
+ public String login(@ShellOption(defaultValue = "AnyUser") String userName) {
+ this.userName = userName;
+ return String.format("Добро пожаловать: %s", userName);
+ }
+
+ @ShellMethod(value = "Publish event command", key = {"p", "pub", "publish"})
+ @ShellMethodAvailability(value = "isPublishEventCommandAvailable")
+ public String publishEvent() {
+ eventsPublisher.publish();
+ return "Событие опубликовано";
+ }
+
+ private Availability isPublishEventCommandAvailable() {
+ return userName == null? Availability.unavailable("Сначала залогиньтесь"): Availability.available();
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/src/main/resources/application.yml b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/resources/application.yml
new file mode 100644
index 00000000..3680b6b5
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/src/main/resources/application.yml
@@ -0,0 +1,8 @@
+logging:
+ level:
+ root: ERROR
+
+
+spring:
+ main:
+ allow-circular-references: true
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/src/test/java/ru/otus/example/applicationeventsdemo/shell/ApplicationEventsCommandsTest.java b/2022-11/spring-07-avdanced-config/application-events-demo/src/test/java/ru/otus/example/applicationeventsdemo/shell/ApplicationEventsCommandsTest.java
new file mode 100644
index 00000000..be44d813
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/src/test/java/ru/otus/example/applicationeventsdemo/shell/ApplicationEventsCommandsTest.java
@@ -0,0 +1,67 @@
+package ru.otus.example.applicationeventsdemo.shell;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.shell.Availability;
+import org.springframework.shell.CommandNotCurrentlyAvailable;
+import org.springframework.shell.Shell;
+import org.springframework.test.annotation.DirtiesContext;
+import ru.otus.example.applicationeventsdemo.events.EventsPublisher;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+@DisplayName("Тест команд shell ")
+@SpringBootTest
+class ApplicationEventsCommandsTest {
+
+ @MockBean
+ private EventsPublisher eventsPublisher;
+
+ @Autowired
+ private Shell shell;
+
+ private static final String GREETING_PATTERN = "Добро пожаловать: %s";
+ private static final String DEFAULT_LOGIN = "AnyUser";
+ private static final String CUSTOM_LOGIN = "Вася";
+ private static final String COMMAND_LOGIN = "login";
+ private static final String COMMAND_LOGIN_SHORT = "l";
+ private static final String COMMAND_PUBLISH = "publish";
+ private static final String COMMAND_PUBLISH_EXPECTED_RESULT = "Событие опубликовано";
+ private static final String COMMAND_LOGIN_PATTERN = "%s %s";
+
+ @DisplayName(" должен возвращать приветствие для всех форм команды логина")
+ @Test
+ void shouldReturnExpectedGreetingAfterLoginCommandEvaluated() {
+ String res = (String) shell.evaluate(() -> COMMAND_LOGIN);
+ assertThat(res).isEqualTo(String.format(GREETING_PATTERN, DEFAULT_LOGIN));
+
+ res = (String) shell.evaluate(() -> COMMAND_LOGIN_SHORT);
+ assertThat(res).isEqualTo(String.format(GREETING_PATTERN, DEFAULT_LOGIN));
+
+ res = (String) shell.evaluate(() -> String.format(COMMAND_LOGIN_PATTERN, COMMAND_LOGIN_SHORT, CUSTOM_LOGIN));
+ assertThat(res).isEqualTo(String.format(GREETING_PATTERN, CUSTOM_LOGIN));
+ }
+
+ @DisplayName(" должен возвращать CommandNotCurrentlyAvailable если при попытке выполнения команды publish пользователь выполнил вход")
+ @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD)
+ @Test
+ void shouldReturnCommandNotCurrentlyAvailableObjectWhenUserDoesNotLoginAfterPublishCommandEvaluated() {
+ Object res = shell.evaluate(() -> COMMAND_PUBLISH);
+ assertThat(res).isInstanceOf(CommandNotCurrentlyAvailable.class);
+ }
+
+ @DisplayName(" должен возвращать статус выполнения команды publish и вызвать соответствующий метод сервиса есл икоманда выполнена после входа")
+ @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD)
+ @Test
+ void shouldReturnExpectedMessageAndFirePublishMethodAfterPublishCommandEvaluated() {
+ shell.evaluate(() -> COMMAND_LOGIN);
+ String res = (String) shell.evaluate(() -> COMMAND_PUBLISH);
+ assertThat(res).isEqualTo(COMMAND_PUBLISH_EXPECTED_RESULT);
+ verify(eventsPublisher, times(1)).publish();
+ }
+}
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/application-events-demo/src/test/resources/application.yml b/2022-11/spring-07-avdanced-config/application-events-demo/src/test/resources/application.yml
new file mode 100644
index 00000000..fc81fe4b
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/application-events-demo/src/test/resources/application.yml
@@ -0,0 +1,6 @@
+spring:
+ shell:
+ interactive:
+ enabled: false
+ main:
+ allow-circular-references: true
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/.gitignore b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/.gitignore
new file mode 100644
index 00000000..789ddc9e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/.gitignore
@@ -0,0 +1,32 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#other
+*.bat
+*/.idea
+*.iml
+*/target
+
+.idea
+*.iml
+target
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/README.md b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/README.md
new file mode 100644
index 00000000..3a4f835e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/README.md
@@ -0,0 +1,11 @@
+#### Упражнение №1
+Условия вечеринки:
+- Алексей придет если condition.alexey-exists=true
+- Анна придет если будет Алексей
+- Олег придет если включен профиль Oleg
+- Петр придет если включен профиль Peter
+- Янис придет если condition.yanis-exists=true
+- Яна придет если нет Алексея, но есть Янис
+
+Измените только одну настройку в application.yml, чтобы на вечеринку пришло максимальное количество людей
+Напечатать имена пришедших на вечеринку можно с помощью команды "ppm" или "print-party-members"
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/pom.xml b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/pom.xml
new file mode 100644
index 00000000..5af7e59e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.6
+
+
+
+ ru.otus.example
+ conditional-and-profiles-exercise
+ 0.0.1-SNAPSHOT
+
+
+ 11
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/ConditionalAndProfilesDemoApplication.java b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/ConditionalAndProfilesDemoApplication.java
new file mode 100644
index 00000000..2aa5c3a4
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/ConditionalAndProfilesDemoApplication.java
@@ -0,0 +1,17 @@
+package ru.otus.example.conditionalandprofilesdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ApplicationContext;
+import ru.otus.example.conditionalandprofilesdemo.model.Party;
+
+@SpringBootApplication
+public class ConditionalAndProfilesDemoApplication {
+
+ public static void main(String[] args) {
+ ApplicationContext ctx = SpringApplication.run(ConditionalAndProfilesDemoApplication.class, args);
+ Party party = ctx.getBean(Party.class);
+ party.printPartyMembers();
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Alexey.java b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Alexey.java
new file mode 100644
index 00000000..66091903
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Alexey.java
@@ -0,0 +1,14 @@
+package ru.otus.example.conditionalandprofilesdemo.model;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+import ru.otus.example.conditionalandprofilesdemo.model.base.Friend;
+
+@ConditionalOnProperty(name = "condition.alexey-exists", havingValue = "true")
+@Component
+public class Alexey extends Friend {
+ @Override
+ public String getName() {
+ return "Алексей";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Anna.java b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Anna.java
new file mode 100644
index 00000000..be26e16d
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Anna.java
@@ -0,0 +1,14 @@
+package ru.otus.example.conditionalandprofilesdemo.model;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.stereotype.Component;
+import ru.otus.example.conditionalandprofilesdemo.model.base.Friend;
+
+@ConditionalOnBean(Alexey.class)
+@Component
+public class Anna extends Friend {
+ @Override
+ public String getName() {
+ return "Аня";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Oleg.java b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Oleg.java
new file mode 100644
index 00000000..2a11f476
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Oleg.java
@@ -0,0 +1,14 @@
+package ru.otus.example.conditionalandprofilesdemo.model;
+
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+import ru.otus.example.conditionalandprofilesdemo.model.base.Friend;
+
+@Profile("Oleg")
+@Component
+public class Oleg extends Friend {
+ @Override
+ public String getName() {
+ return "Олег";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Party.java b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Party.java
new file mode 100644
index 00000000..18a53b5d
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Party.java
@@ -0,0 +1,19 @@
+package ru.otus.example.conditionalandprofilesdemo.model;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import ru.otus.example.conditionalandprofilesdemo.model.base.Friend;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+@RequiredArgsConstructor
+public class Party {
+ private final List partyMembers;
+
+ public void printPartyMembers() {
+ System.out.println("Участники вечеринки:");
+ System.out.println(partyMembers.stream().map(Friend::getName).collect(Collectors.joining("\n")));
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Peter.java b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Peter.java
new file mode 100644
index 00000000..435891a8
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Peter.java
@@ -0,0 +1,15 @@
+package ru.otus.example.conditionalandprofilesdemo.model;
+
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+import ru.otus.example.conditionalandprofilesdemo.model.base.Friend;
+
+@Profile("Peter")
+@Component
+public class Peter extends Friend {
+
+ @Override
+ public String getName() {
+ return "Петр";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Yana.java b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Yana.java
new file mode 100644
index 00000000..76b0fca3
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Yana.java
@@ -0,0 +1,16 @@
+package ru.otus.example.conditionalandprofilesdemo.model;
+
+import org.springframework.context.annotation.Conditional;
+import org.springframework.stereotype.Component;
+import ru.otus.example.conditionalandprofilesdemo.model.base.Friend;
+import ru.otus.example.conditionalandprofilesdemo.model.conditions.YanaConditions;
+
+
+@Conditional(YanaConditions.class)
+@Component
+public class Yana extends Friend {
+ @Override
+ public String getName() {
+ return "Яна";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Yanis.java b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Yanis.java
new file mode 100644
index 00000000..6dd2c14d
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/Yanis.java
@@ -0,0 +1,14 @@
+package ru.otus.example.conditionalandprofilesdemo.model;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+import ru.otus.example.conditionalandprofilesdemo.model.base.Friend;
+
+@ConditionalOnProperty(name = "condition.yanis-exists", havingValue = "true")
+@Component
+public class Yanis extends Friend {
+ @Override
+ public String getName() {
+ return "Янис";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/base/Friend.java b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/base/Friend.java
new file mode 100644
index 00000000..2d2eb67d
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/base/Friend.java
@@ -0,0 +1,5 @@
+package ru.otus.example.conditionalandprofilesdemo.model.base;
+
+public abstract class Friend {
+ public abstract String getName();
+}
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/conditions/YanaConditions.java b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/conditions/YanaConditions.java
new file mode 100644
index 00000000..667aa9fb
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/java/ru/otus/example/conditionalandprofilesdemo/model/conditions/YanaConditions.java
@@ -0,0 +1,20 @@
+package ru.otus.example.conditionalandprofilesdemo.model.conditions;
+
+import org.springframework.boot.autoconfigure.condition.AllNestedConditions;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+
+public class YanaConditions extends AllNestedConditions {
+
+ public YanaConditions() {
+ super(ConfigurationPhase.REGISTER_BEAN);
+ }
+
+
+ @ConditionalOnProperty(name = "condition.alexey-exists", havingValue = "false")
+ static class AlexeyDoesNotExistsCondition {
+ }
+
+ @ConditionalOnProperty(name = "condition.yanis-exists", havingValue = "true")
+ static class YanisExistsCondition {
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/resources/application-Peter.yml b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/resources/application-Peter.yml
new file mode 100644
index 00000000..aa28b2ce
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/resources/application-Peter.yml
@@ -0,0 +1,2 @@
+condition:
+ #yanis-exists: true
diff --git a/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/resources/application.yml b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/resources/application.yml
new file mode 100644
index 00000000..50db026d
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/conditional-and-profiles-exercise/src/main/resources/application.yml
@@ -0,0 +1,20 @@
+condition:
+ alexey-exists: true
+ yanis-exists: false
+
+spring:
+ profiles:
+ #Доступные профили: Oleg и Peter
+ active:
+
+logging:
+ level:
+ root: ERROR
+
+
+---
+spring:
+ profiles: Peter
+
+condition:
+ yanis-exists: true
diff --git a/2022-11/spring-07-avdanced-config/pom.xml b/2022-11/spring-07-avdanced-config/pom.xml
new file mode 100644
index 00000000..56e72f81
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/pom.xml
@@ -0,0 +1,24 @@
+
+
+ 4.0.0
+
+ ru.otus
+ advanced-config-class-work
+ 1.0
+
+ pom
+
+
+ conditional-and-profiles-exercise
+ application-events-demo
+ test-configuration-exercise-1
+ test-configuration-exercise-2
+ test-configuration-exercise-3
+ test-configuration-solution-1
+ test-configuration-solution-2
+ test-configuration-solution-3
+ test-caching-demo
+
+
diff --git a/2022-11/spring-07-avdanced-config/spring-shell.log b/2022-11/spring-07-avdanced-config/spring-shell.log
new file mode 100644
index 00000000..c311b9b2
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/spring-shell.log
@@ -0,0 +1,4 @@
+1663965456055:l
+1663965459148:p
+1663965475408:l
+1663965476596:p
diff --git a/2022-11/spring-07-avdanced-config/test-caching-demo/.gitignore b/2022-11/spring-07-avdanced-config/test-caching-demo/.gitignore
new file mode 100644
index 00000000..789ddc9e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-caching-demo/.gitignore
@@ -0,0 +1,32 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#other
+*.bat
+*/.idea
+*.iml
+*/target
+
+.idea
+*.iml
+target
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-caching-demo/pom.xml b/2022-11/spring-07-avdanced-config/test-caching-demo/pom.xml
new file mode 100644
index 00000000..5a786493
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-caching-demo/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.6
+
+
+
+ ru.otus.example
+ test-caching-demo
+ 0.0.1-SNAPSHOT
+
+
+ 11
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/2022-11/spring-07-avdanced-config/test-caching-demo/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java b/2022-11/spring-07-avdanced-config/test-caching-demo/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
new file mode 100644
index 00000000..fe8a8f68
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-caching-demo/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
@@ -0,0 +1,14 @@
+package ru.otus.example.testconfigurationdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+public class TestConfigurationDemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(TestConfigurationDemoApplication.class, args);
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-caching-demo/src/main/java/ru/otus/example/testconfigurationdemo/statefulservices/Service1.java b/2022-11/spring-07-avdanced-config/test-caching-demo/src/main/java/ru/otus/example/testconfigurationdemo/statefulservices/Service1.java
new file mode 100644
index 00000000..9983209e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-caching-demo/src/main/java/ru/otus/example/testconfigurationdemo/statefulservices/Service1.java
@@ -0,0 +1,15 @@
+package ru.otus.example.testconfigurationdemo.statefulservices;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.stereotype.Service;
+
+@Service
+public class Service1 {
+ @Getter
+ private final String name = "Service1";
+
+ @Getter
+ @Setter
+ private String state = "State1";
+}
diff --git a/2022-11/spring-07-avdanced-config/test-caching-demo/src/main/java/ru/otus/example/testconfigurationdemo/statefulservices/Service2.java b/2022-11/spring-07-avdanced-config/test-caching-demo/src/main/java/ru/otus/example/testconfigurationdemo/statefulservices/Service2.java
new file mode 100644
index 00000000..43586e62
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-caching-demo/src/main/java/ru/otus/example/testconfigurationdemo/statefulservices/Service2.java
@@ -0,0 +1,15 @@
+package ru.otus.example.testconfigurationdemo.statefulservices;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.stereotype.Service;
+
+@Service
+public class Service2 {
+ @Getter
+ private final String name = "Service2";
+
+ @Getter
+ @Setter
+ private String state = "State2";
+}
diff --git a/2022-11/spring-07-avdanced-config/test-caching-demo/src/test/java/ru/otus/example/testconfigurationdemo/statefulservices/IntegrationTest1.java b/2022-11/spring-07-avdanced-config/test-caching-demo/src/test/java/ru/otus/example/testconfigurationdemo/statefulservices/IntegrationTest1.java
new file mode 100644
index 00000000..f756ccd2
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-caching-demo/src/test/java/ru/otus/example/testconfigurationdemo/statefulservices/IntegrationTest1.java
@@ -0,0 +1,42 @@
+package ru.otus.example.testconfigurationdemo.statefulservices;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.TestPropertySource;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+//@SpringBootTest(classes = {Service1.class, Service2.class})
+//@TestPropertySource("classpath:test.properties")
+//@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
+@SpringBootTest
+class IntegrationTest1 {
+
+ @Autowired
+ private Service1 service1;
+
+ //@MockBean
+ @Autowired
+ private Service2 service2;
+
+ @Test
+ void test1() {
+ System.out.println(service1.getName() + ": " + service1.getState());
+ System.out.println(service2.getName() + ": " + service2.getState());
+
+ service1.setState("State7");
+ service2.setState("State8");
+ }
+
+ @Test
+ void test2() {
+ System.out.println(service1.getName() + ": " + service1.getState());
+ System.out.println(service2.getName() + ": " + service2.getState());
+
+ service1.setState("State9");
+ service2.setState("State10");
+ }
+}
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-caching-demo/src/test/java/ru/otus/example/testconfigurationdemo/statefulservices/IntegrationTest2.java b/2022-11/spring-07-avdanced-config/test-caching-demo/src/test/java/ru/otus/example/testconfigurationdemo/statefulservices/IntegrationTest2.java
new file mode 100644
index 00000000..fcd6c2bf
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-caching-demo/src/test/java/ru/otus/example/testconfigurationdemo/statefulservices/IntegrationTest2.java
@@ -0,0 +1,33 @@
+package ru.otus.example.testconfigurationdemo.statefulservices;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class IntegrationTest2 {
+
+ @Autowired
+ private Service1 service1;
+
+ @Autowired
+ private Service2 service2;
+
+ @Test
+ void test3() {
+ System.out.println(service1.getName() + ": " + service1.getState());
+ System.out.println(service2.getName() + ": " + service2.getState());
+
+ service1.setState("State3");
+ service2.setState("State4");
+ }
+
+ @Test
+ void test4() {
+ System.out.println(service1.getName() + ": " + service1.getState());
+ System.out.println(service2.getName() + ": " + service2.getState());
+
+ service1.setState("State5");
+ service2.setState("State6");
+ }
+}
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-caching-demo/src/test/resources/test.properties b/2022-11/spring-07-avdanced-config/test-caching-demo/src/test/resources/test.properties
new file mode 100644
index 00000000..257a47f4
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-caching-demo/src/test/resources/test.properties
@@ -0,0 +1 @@
+any.prop=10
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/.gitignore b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/.gitignore
new file mode 100644
index 00000000..789ddc9e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/.gitignore
@@ -0,0 +1,32 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#other
+*.bat
+*/.idea
+*.iml
+*/target
+
+.idea
+*.iml
+target
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/README.md b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/README.md
new file mode 100644
index 00000000..301b2d83
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/README.md
@@ -0,0 +1,9 @@
+#### Упражнение №2. Должен остаться только один
+
+С помощью вложенных конфигураций сделать так,
+чтобы прошел NestedConfigurationDemoTest
+(family должно содержать только собаку)
+
+- Сделать вложенный класс конфигурации. Не забываем про static
+- Выбрать тип конфигурации (@Configuration/@TestConfiguration)
+- С помощью @Bean/@ComponentScan добавить в контекст нужный бин(ы)
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/pom.xml b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/pom.xml
new file mode 100644
index 00000000..5ed3c280
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.6
+
+
+
+ ru.otus.example
+ test-configuration-exercise-1
+ 0.0.1-SNAPSHOT
+
+
+ 11
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
new file mode 100644
index 00000000..e5dd8341
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
@@ -0,0 +1,15 @@
+package ru.otus.example.testconfigurationdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@ComponentScan("ru.otus.example.testconfigurationdemo.family")
+@SpringBootApplication
+public class TestConfigurationDemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(TestConfigurationDemoApplication.class, args);
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java
new file mode 100644
index 00000000..1685a4cc
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java
@@ -0,0 +1,5 @@
+package ru.otus.example.testconfigurationdemo.family;
+
+public abstract class FamilyMember {
+ public abstract String getName();
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java
new file mode 100644
index 00000000..f3da3289
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java
@@ -0,0 +1,12 @@
+package ru.otus.example.testconfigurationdemo.family.childrens;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Son extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Сын";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java
new file mode 100644
index 00000000..d531bda5
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java
@@ -0,0 +1,10 @@
+package ru.otus.example.testconfigurationdemo.family.parents;
+
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+public class Father extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Папа";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java
new file mode 100644
index 00000000..d9b97b75
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java
@@ -0,0 +1,12 @@
+package ru.otus.example.testconfigurationdemo.family.parents;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Mother extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Мама";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java
new file mode 100644
index 00000000..3e436c12
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java
@@ -0,0 +1,13 @@
+package ru.otus.example.testconfigurationdemo.family.pets;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Dog extends FamilyMember {
+
+ @Override
+ public String getName() {
+ return "Собака";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/test/java/ru/otus/example/testconfigurationdemo/demo/NestedConfigurationDemoTest.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/test/java/ru/otus/example/testconfigurationdemo/demo/NestedConfigurationDemoTest.java
new file mode 100644
index 00000000..6f1795d0
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/test/java/ru/otus/example/testconfigurationdemo/demo/NestedConfigurationDemoTest.java
@@ -0,0 +1,26 @@
+package ru.otus.example.testconfigurationdemo.demo;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@DisplayName("В NestedConfigurationDemoTest семья должна ")
+@SpringBootTest
+public class NestedConfigurationDemoTest {
+
+ @Autowired
+ private Map family;
+
+ @DisplayName(" содержать только собаку ")
+ @Test
+ void shouldContainOnlyDog() {
+ assertThat(family).containsOnlyKeys("dog");
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/test/java/ru/otus/example/testconfigurationdemo/demo/PlainSpringBootTestDemoTest.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/test/java/ru/otus/example/testconfigurationdemo/demo/PlainSpringBootTestDemoTest.java
new file mode 100644
index 00000000..66932497
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-1/src/test/java/ru/otus/example/testconfigurationdemo/demo/PlainSpringBootTestDemoTest.java
@@ -0,0 +1,26 @@
+package ru.otus.example.testconfigurationdemo.demo;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@DisplayName("В PlainSpringBootTestDemoTest семья должна ")
+@SpringBootTest
+public class PlainSpringBootTestDemoTest {
+
+ @Autowired
+ private Map family;
+
+ @DisplayName(" содержать маму, сына и собаку ")
+ @Test
+ void shouldContainAllFamilyExceptFather() {
+ assertThat(family).containsOnlyKeys("mother", "son", "dog");
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/.gitignore b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/.gitignore
new file mode 100644
index 00000000..789ddc9e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/.gitignore
@@ -0,0 +1,32 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#other
+*.bat
+*/.idea
+*.iml
+*/target
+
+.idea
+*.iml
+target
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/README.md b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/README.md
new file mode 100644
index 00000000..a5258087
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/README.md
@@ -0,0 +1,9 @@
+#### Упражнение №3. Вернуть отца в семью
+
+С помощью вложенных конфигураций сделать так,
+чтобы прошел NestedTestConfigurationDemoTest
+(family должно содержать маму, папу, сына и собаку)
+
+- Сделать вложенный класс конфигурации. Не забываем про static
+- Выбрать тип конфигурации (@Configuration/@TestConfiguration)
+- С помощью @Bean/@ComponentScan добавить в контекст нужный бин(ы)
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/pom.xml b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/pom.xml
new file mode 100644
index 00000000..78e6e744
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.6
+
+
+
+ ru.otus.example
+ test-configuration-exercise-2
+ 0.0.1-SNAPSHOT
+
+
+ 11
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
new file mode 100644
index 00000000..e5dd8341
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
@@ -0,0 +1,15 @@
+package ru.otus.example.testconfigurationdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@ComponentScan("ru.otus.example.testconfigurationdemo.family")
+@SpringBootApplication
+public class TestConfigurationDemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(TestConfigurationDemoApplication.class, args);
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java
new file mode 100644
index 00000000..1685a4cc
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java
@@ -0,0 +1,5 @@
+package ru.otus.example.testconfigurationdemo.family;
+
+public abstract class FamilyMember {
+ public abstract String getName();
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java
new file mode 100644
index 00000000..f3da3289
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java
@@ -0,0 +1,12 @@
+package ru.otus.example.testconfigurationdemo.family.childrens;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Son extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Сын";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java
new file mode 100644
index 00000000..d531bda5
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java
@@ -0,0 +1,10 @@
+package ru.otus.example.testconfigurationdemo.family.parents;
+
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+public class Father extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Папа";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java
new file mode 100644
index 00000000..d9b97b75
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java
@@ -0,0 +1,12 @@
+package ru.otus.example.testconfigurationdemo.family.parents;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Mother extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Мама";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java
new file mode 100644
index 00000000..3e436c12
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java
@@ -0,0 +1,13 @@
+package ru.otus.example.testconfigurationdemo.family.pets;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Dog extends FamilyMember {
+
+ @Override
+ public String getName() {
+ return "Собака";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/test/java/ru/otus/example/testconfigurationdemo/demo/NestedTestConfigurationDemoTest.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/test/java/ru/otus/example/testconfigurationdemo/demo/NestedTestConfigurationDemoTest.java
new file mode 100644
index 00000000..a4b13be6
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-2/src/test/java/ru/otus/example/testconfigurationdemo/demo/NestedTestConfigurationDemoTest.java
@@ -0,0 +1,26 @@
+package ru.otus.example.testconfigurationdemo.demo;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@DisplayName("В NestedTestConfigurationDemoTest семья должна ")
+@SpringBootTest
+public class NestedTestConfigurationDemoTest {
+
+ @Autowired
+ private Map family;
+
+ @DisplayName(" содержать маму, папу, сына и собаку ")
+ @Test
+ void shouldContainAllFamilyWithFather() {
+ assertThat(family).containsOnlyKeys("mother", "father", "son", "dog");
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/.gitignore b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/.gitignore
new file mode 100644
index 00000000..789ddc9e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/.gitignore
@@ -0,0 +1,32 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#other
+*.bat
+*/.idea
+*.iml
+*/target
+
+.idea
+*.iml
+target
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/README.md b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/README.md
new file mode 100644
index 00000000..7d9a8b46
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/README.md
@@ -0,0 +1,8 @@
+#### Упражнение №4. Вся семья, но без собаки
+
+С помощью внешней конфигурации сделать так,
+чтобы прошел SpringBootTestWithExternalLimitationDemoTest
+(family должно содержать маму, папу и сына)
+
+- Над TestSpringBootConfiguration повесить @SpringBootConfiguration
+- С помощью @Bean/@ComponentScan добавить в контекст нужный бин(ы)
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/pom.xml b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/pom.xml
new file mode 100644
index 00000000..5a56cc9a
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/pom.xml
@@ -0,0 +1,51 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.6
+
+
+
+ ru.otus.example
+ test-configuration-exercise-3
+ 0.0.1-SNAPSHOT
+ test-configuration-demo
+ Test configuration demo
+
+
+ 11
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
new file mode 100644
index 00000000..e5dd8341
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
@@ -0,0 +1,15 @@
+package ru.otus.example.testconfigurationdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@ComponentScan("ru.otus.example.testconfigurationdemo.family")
+@SpringBootApplication
+public class TestConfigurationDemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(TestConfigurationDemoApplication.class, args);
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java
new file mode 100644
index 00000000..1685a4cc
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java
@@ -0,0 +1,5 @@
+package ru.otus.example.testconfigurationdemo.family;
+
+public abstract class FamilyMember {
+ public abstract String getName();
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java
new file mode 100644
index 00000000..f3da3289
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java
@@ -0,0 +1,12 @@
+package ru.otus.example.testconfigurationdemo.family.childrens;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Son extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Сын";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java
new file mode 100644
index 00000000..d531bda5
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java
@@ -0,0 +1,10 @@
+package ru.otus.example.testconfigurationdemo.family.parents;
+
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+public class Father extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Папа";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java
new file mode 100644
index 00000000..d9b97b75
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java
@@ -0,0 +1,12 @@
+package ru.otus.example.testconfigurationdemo.family.parents;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Mother extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Мама";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java
new file mode 100644
index 00000000..3e436c12
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java
@@ -0,0 +1,13 @@
+package ru.otus.example.testconfigurationdemo.family.pets;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Dog extends FamilyMember {
+
+ @Override
+ public String getName() {
+ return "Собака";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/test/java/ru/otus/example/testconfigurationdemo/demo/SpringBootTestWithExternalLimitationDemoTest.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/test/java/ru/otus/example/testconfigurationdemo/demo/SpringBootTestWithExternalLimitationDemoTest.java
new file mode 100644
index 00000000..2091efeb
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/test/java/ru/otus/example/testconfigurationdemo/demo/SpringBootTestWithExternalLimitationDemoTest.java
@@ -0,0 +1,26 @@
+package ru.otus.example.testconfigurationdemo.demo;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@DisplayName("В SpringBootTestWithExternalLimitationDemoTest семья должна ")
+@SpringBootTest
+public class SpringBootTestWithExternalLimitationDemoTest {
+
+ @Autowired
+ private Map family;
+
+ @DisplayName(" содержать маму, папу и сына")
+ @Test
+ void shouldContainAllFamilyExceptFather() {
+ assertThat(family).containsOnlyKeys("mother", "father", "son");
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/test/java/ru/otus/example/testconfigurationdemo/demo/TestSpringBootConfiguration.java b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/test/java/ru/otus/example/testconfigurationdemo/demo/TestSpringBootConfiguration.java
new file mode 100644
index 00000000..526a3c5f
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-exercise-3/src/test/java/ru/otus/example/testconfigurationdemo/demo/TestSpringBootConfiguration.java
@@ -0,0 +1,4 @@
+package ru.otus.example.testconfigurationdemo.demo;
+
+public class TestSpringBootConfiguration {
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-1/.gitignore b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/.gitignore
new file mode 100644
index 00000000..789ddc9e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/.gitignore
@@ -0,0 +1,32 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#other
+*.bat
+*/.idea
+*.iml
+*/target
+
+.idea
+*.iml
+target
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-1/README.md b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/README.md
new file mode 100644
index 00000000..58255627
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/README.md
@@ -0,0 +1,7 @@
+#### Решение упражнения №2
+По заданию нужно ограничить контекст одним бином с помощью вложенной конфигурации.
+@TestConfiguration не ограничивает, а дополняет контекст новыми бинами или подменяет те, что уже там.
+Соответственно выбираем @Configuration. Вешаем его над вложенным статическим классом.
+Т.к. Dog является @Component, то для его размещения в контексте подойдет любое из:
+- @ComponentScan("ru.otus.example.testconfigurationdemo.family.pets") над конфигурацией
+- Создание бина, через метод с аннотацией @Bean внутри конфигурации
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-1/pom.xml b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/pom.xml
new file mode 100644
index 00000000..97ae6a56
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.6
+
+
+
+ ru.otus.example
+ test-configuration-solution-1
+ 0.0.1-SNAPSHOT
+
+
+ 11
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
new file mode 100644
index 00000000..e5dd8341
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
@@ -0,0 +1,15 @@
+package ru.otus.example.testconfigurationdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@ComponentScan("ru.otus.example.testconfigurationdemo.family")
+@SpringBootApplication
+public class TestConfigurationDemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(TestConfigurationDemoApplication.class, args);
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java
new file mode 100644
index 00000000..1685a4cc
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java
@@ -0,0 +1,5 @@
+package ru.otus.example.testconfigurationdemo.family;
+
+public abstract class FamilyMember {
+ public abstract String getName();
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java
new file mode 100644
index 00000000..f3da3289
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java
@@ -0,0 +1,12 @@
+package ru.otus.example.testconfigurationdemo.family.childrens;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Son extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Сын";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java
new file mode 100644
index 00000000..d531bda5
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java
@@ -0,0 +1,10 @@
+package ru.otus.example.testconfigurationdemo.family.parents;
+
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+public class Father extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Папа";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java
new file mode 100644
index 00000000..d9b97b75
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java
@@ -0,0 +1,12 @@
+package ru.otus.example.testconfigurationdemo.family.parents;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Mother extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Мама";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java
new file mode 100644
index 00000000..3e436c12
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java
@@ -0,0 +1,13 @@
+package ru.otus.example.testconfigurationdemo.family.pets;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Dog extends FamilyMember {
+
+ @Override
+ public String getName() {
+ return "Собака";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/test/java/ru/otus/example/testconfigurationdemo/demo/NestedConfigurationDemoTest.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/test/java/ru/otus/example/testconfigurationdemo/demo/NestedConfigurationDemoTest.java
new file mode 100644
index 00000000..7d496500
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/test/java/ru/otus/example/testconfigurationdemo/demo/NestedConfigurationDemoTest.java
@@ -0,0 +1,41 @@
+package ru.otus.example.testconfigurationdemo.demo;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+import ru.otus.example.testconfigurationdemo.family.pets.Dog;
+
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@DisplayName("В NestedConfigurationDemoTest семья должна ")
+@SpringBootTest
+public class NestedConfigurationDemoTest {
+
+ @ComponentScan("ru.otus.example.testconfigurationdemo.family.pets")
+ @Configuration
+ static class NestedConfiguration {
+/*
+ @Bean
+ FamilyMember dog() {
+ return new Dog();
+ }
+*/
+ }
+
+ @Autowired
+ private Map family;
+
+ @DisplayName(" содержать только собаку ")
+ @Test
+ void shouldContainOnlyDog() {
+ assertThat(family).containsOnlyKeys("dog");
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/test/java/ru/otus/example/testconfigurationdemo/demo/PlainSpringBootTestDemoTest.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/test/java/ru/otus/example/testconfigurationdemo/demo/PlainSpringBootTestDemoTest.java
new file mode 100644
index 00000000..66932497
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-1/src/test/java/ru/otus/example/testconfigurationdemo/demo/PlainSpringBootTestDemoTest.java
@@ -0,0 +1,26 @@
+package ru.otus.example.testconfigurationdemo.demo;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@DisplayName("В PlainSpringBootTestDemoTest семья должна ")
+@SpringBootTest
+public class PlainSpringBootTestDemoTest {
+
+ @Autowired
+ private Map family;
+
+ @DisplayName(" содержать маму, сына и собаку ")
+ @Test
+ void shouldContainAllFamilyExceptFather() {
+ assertThat(family).containsOnlyKeys("mother", "son", "dog");
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-2/.gitignore b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/.gitignore
new file mode 100644
index 00000000..789ddc9e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/.gitignore
@@ -0,0 +1,32 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#other
+*.bat
+*/.idea
+*.iml
+*/target
+
+.idea
+*.iml
+target
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-2/README.md b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/README.md
new file mode 100644
index 00000000..9b9c122d
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/README.md
@@ -0,0 +1,8 @@
+#### Решение упражнения №3
+По заданию нужно добавить в контекст бин, которого там нет, с помощью вложенной конфигурации.
+
+Эту проблему можно решить с помощью @Configuration, фактически заново сформировав контекст.
+При этом @TestConfiguration может дополнить существующий. Соответственно выбираем его и вешаем над вложенным статическим классом.
+
+Т.к. Father НЕ является @Component, то для его размещения в контексте нужно его создать,
+через метод с аннотацией @Bean внутри тестовой конфигурации
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-2/pom.xml b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/pom.xml
new file mode 100644
index 00000000..1e01411c
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.6
+
+
+
+ ru.otus.example
+ test-configuration-solution-2
+ 0.0.1-SNAPSHOT
+
+
+ 11
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
new file mode 100644
index 00000000..e5dd8341
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
@@ -0,0 +1,15 @@
+package ru.otus.example.testconfigurationdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@ComponentScan("ru.otus.example.testconfigurationdemo.family")
+@SpringBootApplication
+public class TestConfigurationDemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(TestConfigurationDemoApplication.class, args);
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java
new file mode 100644
index 00000000..1685a4cc
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java
@@ -0,0 +1,5 @@
+package ru.otus.example.testconfigurationdemo.family;
+
+public abstract class FamilyMember {
+ public abstract String getName();
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java
new file mode 100644
index 00000000..f3da3289
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java
@@ -0,0 +1,12 @@
+package ru.otus.example.testconfigurationdemo.family.childrens;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Son extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Сын";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java
new file mode 100644
index 00000000..d531bda5
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java
@@ -0,0 +1,10 @@
+package ru.otus.example.testconfigurationdemo.family.parents;
+
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+public class Father extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Папа";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java
new file mode 100644
index 00000000..d9b97b75
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java
@@ -0,0 +1,12 @@
+package ru.otus.example.testconfigurationdemo.family.parents;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Mother extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Мама";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java
new file mode 100644
index 00000000..3e436c12
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java
@@ -0,0 +1,13 @@
+package ru.otus.example.testconfigurationdemo.family.pets;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Dog extends FamilyMember {
+
+ @Override
+ public String getName() {
+ return "Собака";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/test/java/ru/otus/example/testconfigurationdemo/demo/NestedTestConfigurationDemoTest.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/test/java/ru/otus/example/testconfigurationdemo/demo/NestedTestConfigurationDemoTest.java
new file mode 100644
index 00000000..33bfe11e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-2/src/test/java/ru/otus/example/testconfigurationdemo/demo/NestedTestConfigurationDemoTest.java
@@ -0,0 +1,37 @@
+package ru.otus.example.testconfigurationdemo.demo;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.context.annotation.Bean;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+import ru.otus.example.testconfigurationdemo.family.parents.Father;
+
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@DisplayName("В NestedTestConfigurationDemoTest семья должна ")
+@SpringBootTest
+public class NestedTestConfigurationDemoTest {
+
+ @TestConfiguration
+ static class NestedTestConfiguration {
+ @Bean
+ FamilyMember father() {
+ return new Father();
+ }
+ }
+
+ @Autowired
+ private Map family;
+
+ @DisplayName(" содержать маму, папу, сына и собаку ")
+ @Test
+ void shouldContainAllFamilyWithFather() {
+ assertThat(family).containsOnlyKeys("mother", "father", "son", "dog");
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-3/.gitignore b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/.gitignore
new file mode 100644
index 00000000..789ddc9e
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/.gitignore
@@ -0,0 +1,32 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#other
+*.bat
+*/.idea
+*.iml
+*/target
+
+.idea
+*.iml
+target
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-3/README.md b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/README.md
new file mode 100644
index 00000000..50aca161
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/README.md
@@ -0,0 +1,12 @@
+#### Решение упражнения №4
+По заданию нужно ограничить контекст заданными бинами, с помощью внешней конфигурации.
+
+Вешаем @SpringBootConfiguration над внешним классом TestSpringBootConfiguration.
+Теперь сканирование конфигураций не уйдет далше него. Ни одного бина не найдется.
+Значит нужно формировать контекст самим.
+
+По заданию в нем должны быть бины типов Mother, Son и Father. Первые два являются @Component.
+Их можно разместить в контексте просканировав соответствующие пакеты с помощью @ComponentScan
+
+Т.к. Father НЕ является @Component, то для его размещения в контексте нужно его создать,
+через метод с аннотацией @Bean внутри тестовой конфигурации
\ No newline at end of file
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-3/pom.xml b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/pom.xml
new file mode 100644
index 00000000..0192d790
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.6
+
+
+
+ ru.otus.example
+ test-configuration-solution-3
+ 0.0.1-SNAPSHOT
+
+
+ 11
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
new file mode 100644
index 00000000..e5dd8341
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/TestConfigurationDemoApplication.java
@@ -0,0 +1,15 @@
+package ru.otus.example.testconfigurationdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@ComponentScan("ru.otus.example.testconfigurationdemo.family")
+@SpringBootApplication
+public class TestConfigurationDemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(TestConfigurationDemoApplication.class, args);
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java
new file mode 100644
index 00000000..1685a4cc
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/FamilyMember.java
@@ -0,0 +1,5 @@
+package ru.otus.example.testconfigurationdemo.family;
+
+public abstract class FamilyMember {
+ public abstract String getName();
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java
new file mode 100644
index 00000000..f3da3289
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/childrens/Son.java
@@ -0,0 +1,12 @@
+package ru.otus.example.testconfigurationdemo.family.childrens;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Son extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Сын";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java
new file mode 100644
index 00000000..d531bda5
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Father.java
@@ -0,0 +1,10 @@
+package ru.otus.example.testconfigurationdemo.family.parents;
+
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+public class Father extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Папа";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java
new file mode 100644
index 00000000..d9b97b75
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/parents/Mother.java
@@ -0,0 +1,12 @@
+package ru.otus.example.testconfigurationdemo.family.parents;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Mother extends FamilyMember {
+ @Override
+ public String getName() {
+ return "Мама";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java
new file mode 100644
index 00000000..3e436c12
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/main/java/ru/otus/example/testconfigurationdemo/family/pets/Dog.java
@@ -0,0 +1,13 @@
+package ru.otus.example.testconfigurationdemo.family.pets;
+
+import org.springframework.stereotype.Component;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+@Component
+public class Dog extends FamilyMember {
+
+ @Override
+ public String getName() {
+ return "Собака";
+ }
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/test/java/ru/otus/example/testconfigurationdemo/demo/SpringBootTestWithExternalLimitationDemoTest.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/test/java/ru/otus/example/testconfigurationdemo/demo/SpringBootTestWithExternalLimitationDemoTest.java
new file mode 100644
index 00000000..2091efeb
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/test/java/ru/otus/example/testconfigurationdemo/demo/SpringBootTestWithExternalLimitationDemoTest.java
@@ -0,0 +1,26 @@
+package ru.otus.example.testconfigurationdemo.demo;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@DisplayName("В SpringBootTestWithExternalLimitationDemoTest семья должна ")
+@SpringBootTest
+public class SpringBootTestWithExternalLimitationDemoTest {
+
+ @Autowired
+ private Map family;
+
+ @DisplayName(" содержать маму, папу и сына")
+ @Test
+ void shouldContainAllFamilyExceptFather() {
+ assertThat(family).containsOnlyKeys("mother", "father", "son");
+ }
+
+}
diff --git a/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/test/java/ru/otus/example/testconfigurationdemo/demo/TestSpringBootConfiguration.java b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/test/java/ru/otus/example/testconfigurationdemo/demo/TestSpringBootConfiguration.java
new file mode 100644
index 00000000..a92ce439
--- /dev/null
+++ b/2022-11/spring-07-avdanced-config/test-configuration-solution-3/src/test/java/ru/otus/example/testconfigurationdemo/demo/TestSpringBootConfiguration.java
@@ -0,0 +1,17 @@
+package ru.otus.example.testconfigurationdemo.demo;
+
+import org.springframework.boot.SpringBootConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import ru.otus.example.testconfigurationdemo.family.FamilyMember;
+import ru.otus.example.testconfigurationdemo.family.parents.Father;
+
+@ComponentScan({"ru.otus.example.testconfigurationdemo.family.parents",
+ "ru.otus.example.testconfigurationdemo.family.childrens"})
+@SpringBootConfiguration
+public class TestSpringBootConfiguration {
+ @Bean
+ FamilyMember father() {
+ return new Father();
+ }
+}