diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/.gitignore b/2021-02/spring-03-aop/spring-03-aop-classwork/.gitignore
new file mode 100644
index 00000000..4ea52072
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/.gitignore
@@ -0,0 +1,24 @@
+target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/pom.xml b/2021-02/spring-03-aop/spring-03-aop-classwork/pom.xml
new file mode 100644
index 00000000..af92b287
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/pom.xml
@@ -0,0 +1,17 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-03-aop-classwork
+ 1.0
+
+ pom
+
+
+ spring-03-exercise
+ spring-03-solution
+
+
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/pom.xml b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/pom.xml
new file mode 100644
index 00000000..0ea87ec9
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/pom.xml
@@ -0,0 +1,42 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-03-exercise
+ 1.0
+
+
+ 11
+ 11
+ UTF-8
+ 5.3.4
+ 1.9.6
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-aop
+ ${spring.version}
+
+
+ org.aspectj
+ aspectjrt
+ ${aspectj.version}
+
+
+ org.aspectj
+ aspectjweaver
+ ${aspectj.version}
+
+
+
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/Main.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..1e9380b4
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,20 @@
+package ru.otus.spring;
+
+import org.springframework.context.annotation.*;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.service.PersonService;
+
+@Configuration
+@ComponentScan
+public class Main {
+
+ public static void main(String[] args) {
+ AnnotationConfigApplicationContext context =
+ new AnnotationConfigApplicationContext(Main.class);
+
+ PersonService service = context.getBean(PersonService.class);
+
+ Person ivan = service.getByName("Ivan");
+ System.out.println("name: " + ivan.getName() + " age: " + ivan.getAge());
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/dao/PersonDao.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/dao/PersonDao.java
new file mode 100644
index 00000000..d33939bd
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/dao/PersonDao.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.dao;
+
+import ru.otus.spring.domain.Person;
+
+public interface PersonDao {
+
+ Person findByName(String name);
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java
new file mode 100644
index 00000000..f8e0bb29
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java
@@ -0,0 +1,12 @@
+package ru.otus.spring.dao;
+
+import org.springframework.stereotype.Repository;
+import ru.otus.spring.domain.Person;
+
+@Repository
+public class PersonDaoSimple implements PersonDao {
+
+ public Person findByName(String name) {
+ return new Person(name, 18);
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/domain/Person.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/domain/Person.java
new file mode 100644
index 00000000..b19b42c1
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/domain/Person.java
@@ -0,0 +1,20 @@
+package ru.otus.spring.domain;
+
+public class Person {
+
+ private String name;
+ private int age;
+
+ public Person(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/logging/LoggingAspect.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/logging/LoggingAspect.java
new file mode 100644
index 00000000..4f12dc0c
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/logging/LoggingAspect.java
@@ -0,0 +1,13 @@
+package ru.otus.spring.logging;
+
+import org.aspectj.lang.JoinPoint;
+
+public class LoggingAspect {
+
+ public void logBefore(JoinPoint joinPoint) {
+ System.out.println("Прокси : " + joinPoint.getThis().getClass().getName());
+ System.out.println("Класс : " + joinPoint.getTarget().getClass().getName());
+
+ System.out.println("Вызов метода : " + joinPoint.getSignature().getName());
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/service/PersonService.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/service/PersonService.java
new file mode 100644
index 00000000..9b83e7de
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/service/PersonService.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.service;
+
+import ru.otus.spring.domain.Person;
+
+public interface PersonService {
+
+ Person getByName(String name);
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/service/PersonServiceImpl.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/service/PersonServiceImpl.java
new file mode 100644
index 00000000..88b311a5
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-exercise/src/main/java/ru/otus/spring/service/PersonServiceImpl.java
@@ -0,0 +1,19 @@
+package ru.otus.spring.service;
+
+import org.springframework.stereotype.Service;
+import ru.otus.spring.dao.PersonDao;
+import ru.otus.spring.domain.Person;
+
+@Service
+public class PersonServiceImpl implements PersonService {
+
+ private final PersonDao dao;
+
+ public PersonServiceImpl(PersonDao dao) {
+ this.dao = dao;
+ }
+
+ public Person getByName(String name) {
+ return dao.findByName(name);
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/pom.xml b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/pom.xml
new file mode 100644
index 00000000..3456ee21
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/pom.xml
@@ -0,0 +1,42 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-03-solution
+ 1.0
+
+
+ 11
+ 11
+ UTF-8
+ 5.3.4
+ 1.9.6
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-aop
+ ${spring.version}
+
+
+ org.aspectj
+ aspectjrt
+ ${aspectj.version}
+
+
+ org.aspectj
+ aspectjweaver
+ ${aspectj.version}
+
+
+
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/Main.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..f4db40b0
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,21 @@
+package ru.otus.spring;
+
+import org.springframework.context.annotation.*;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.service.PersonService;
+
+@EnableAspectJAutoProxy
+@Configuration
+@ComponentScan
+public class Main {
+
+ public static void main(String[] args) {
+ AnnotationConfigApplicationContext context =
+ new AnnotationConfigApplicationContext(Main.class);
+
+ PersonService service = context.getBean(PersonService.class);
+
+ Person ivan = service.getByName("Ivan");
+ System.out.println("name: " + ivan.getName() + " age: " + ivan.getAge());
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/dao/PersonDao.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/dao/PersonDao.java
new file mode 100644
index 00000000..d33939bd
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/dao/PersonDao.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.dao;
+
+import ru.otus.spring.domain.Person;
+
+public interface PersonDao {
+
+ Person findByName(String name);
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java
new file mode 100644
index 00000000..f8e0bb29
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java
@@ -0,0 +1,12 @@
+package ru.otus.spring.dao;
+
+import org.springframework.stereotype.Repository;
+import ru.otus.spring.domain.Person;
+
+@Repository
+public class PersonDaoSimple implements PersonDao {
+
+ public Person findByName(String name) {
+ return new Person(name, 18);
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/domain/Person.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/domain/Person.java
new file mode 100644
index 00000000..b19b42c1
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/domain/Person.java
@@ -0,0 +1,20 @@
+package ru.otus.spring.domain;
+
+public class Person {
+
+ private String name;
+ private int age;
+
+ public Person(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/logging/LoggingAspect.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/logging/LoggingAspect.java
new file mode 100644
index 00000000..a5622c3d
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/logging/LoggingAspect.java
@@ -0,0 +1,19 @@
+package ru.otus.spring.logging;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.springframework.stereotype.Component;
+
+@Aspect
+@Component
+public class LoggingAspect {
+
+ @Before("execution(* ru.otus.spring.dao.PersonDaoSimple.*(..))")
+ public void logBefore(JoinPoint joinPoint) {
+ System.out.println("Прокси : " + joinPoint.getThis().getClass().getName());
+ System.out.println("Класс : " + joinPoint.getTarget().getClass().getName());
+
+ System.out.println("Вызов метода : " + joinPoint.getSignature().getName());
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/service/PersonService.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/service/PersonService.java
new file mode 100644
index 00000000..9b83e7de
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/service/PersonService.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.service;
+
+import ru.otus.spring.domain.Person;
+
+public interface PersonService {
+
+ Person getByName(String name);
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/service/PersonServiceImpl.java b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/service/PersonServiceImpl.java
new file mode 100644
index 00000000..88b311a5
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-classwork/spring-03-solution/src/main/java/ru/otus/spring/service/PersonServiceImpl.java
@@ -0,0 +1,19 @@
+package ru.otus.spring.service;
+
+import org.springframework.stereotype.Service;
+import ru.otus.spring.dao.PersonDao;
+import ru.otus.spring.domain.Person;
+
+@Service
+public class PersonServiceImpl implements PersonService {
+
+ private final PersonDao dao;
+
+ public PersonServiceImpl(PersonDao dao) {
+ this.dao = dao;
+ }
+
+ public Person getByName(String name) {
+ return dao.findByName(name);
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/.gitignore b/2021-02/spring-03-aop/spring-03-aop-demo/.gitignore
new file mode 100644
index 00000000..4ea52072
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/.gitignore
@@ -0,0 +1,24 @@
+target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/pom.xml b/2021-02/spring-03-aop/spring-03-aop-demo/pom.xml
new file mode 100644
index 00000000..7d522882
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/pom.xml
@@ -0,0 +1,18 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-03-aop-demo
+ 1.0
+
+ pom
+
+
+ spring-03-aop-ctw
+ spring-03-aop-ltw
+ spring-03-aop-native
+
+
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/pom.xml b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/pom.xml
new file mode 100644
index 00000000..77503e81
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/pom.xml
@@ -0,0 +1,105 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-03-aop-ctw
+ 1.0
+
+
+ 11
+ 11
+ UTF-8
+ 5.3.4
+ 1.9.6
+ 1.12.6
+
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-aop
+ ${spring.version}
+
+
+ org.aspectj
+ aspectjrt
+ ${aspectj.version}
+
+
+ org.aspectj
+ aspectjweaver
+ ${aspectj.version}
+
+
+
+ com.nickwongdev
+ aspectj-maven-plugin
+ ${aspectj.plugin.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ jar-with-dependencies
+
+
+
+ ru.otus.spring.Main
+
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+ com.nickwongdev
+ aspectj-maven-plugin
+ ${aspectj.plugin.version}
+
+ 11
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+ true
+ true
+ ignore
+ UTF-8
+
+ ${project.build.directory}/classes
+
+ true
+
+
+
+
+ compile
+
+
+
+
+
+
+
+
+
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/Main.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..75e5ef9a
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,30 @@
+package ru.otus.spring;
+
+import org.springframework.context.annotation.*;
+import org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver;
+import org.springframework.instrument.classloading.LoadTimeWeaver;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.service.PersonService;
+
+/*
+Запуск примера:
+ 1. cd spring-03-aop-demo/spring-03-aop-ctw/
+ 2. mvn clean package
+ 3. cd target
+ 4. java -jar spring-03-aop-ctw-1.0-jar-with-dependencies.jar
+ */
+
+@Configuration
+@ComponentScan
+public class Main {
+
+ public static void main(String[] args) {
+ AnnotationConfigApplicationContext context =
+ new AnnotationConfigApplicationContext(Main.class);
+
+ PersonService service = context.getBean(PersonService.class);
+
+ Person ivan = service.getByName("Ivan");
+ System.out.println("name: " + ivan.getName() + " age: " + ivan.getAge());
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/dao/PersonDao.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/dao/PersonDao.java
new file mode 100644
index 00000000..d33939bd
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/dao/PersonDao.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.dao;
+
+import ru.otus.spring.domain.Person;
+
+public interface PersonDao {
+
+ Person findByName(String name);
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java
new file mode 100644
index 00000000..f8e0bb29
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java
@@ -0,0 +1,12 @@
+package ru.otus.spring.dao;
+
+import org.springframework.stereotype.Repository;
+import ru.otus.spring.domain.Person;
+
+@Repository
+public class PersonDaoSimple implements PersonDao {
+
+ public Person findByName(String name) {
+ return new Person(name, 18);
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/domain/Person.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/domain/Person.java
new file mode 100644
index 00000000..b19b42c1
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/domain/Person.java
@@ -0,0 +1,20 @@
+package ru.otus.spring.domain;
+
+public class Person {
+
+ private String name;
+ private int age;
+
+ public Person(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/logging/LoggingAspect.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/logging/LoggingAspect.java
new file mode 100644
index 00000000..17a56801
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/logging/LoggingAspect.java
@@ -0,0 +1,18 @@
+package ru.otus.spring.logging;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.springframework.stereotype.Component;
+
+@Aspect
+public class LoggingAspect {
+
+ @Before("execution(* ru.otus.spring.dao.PersonDaoSimple.*(..))")
+ public void logBefore(JoinPoint joinPoint) {
+ System.out.println("Прокси : " + joinPoint.getThis().getClass().getName());
+ System.out.println("Класс : " + joinPoint.getTarget().getClass().getName());
+
+ System.out.println("Вызов метода : " + joinPoint.getSignature().getName());
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/service/PersonService.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/service/PersonService.java
new file mode 100644
index 00000000..9b83e7de
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/service/PersonService.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.service;
+
+import ru.otus.spring.domain.Person;
+
+public interface PersonService {
+
+ Person getByName(String name);
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/service/PersonServiceImpl.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/service/PersonServiceImpl.java
new file mode 100644
index 00000000..88b311a5
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ctw/src/main/java/ru/otus/spring/service/PersonServiceImpl.java
@@ -0,0 +1,19 @@
+package ru.otus.spring.service;
+
+import org.springframework.stereotype.Service;
+import ru.otus.spring.dao.PersonDao;
+import ru.otus.spring.domain.Person;
+
+@Service
+public class PersonServiceImpl implements PersonService {
+
+ private final PersonDao dao;
+
+ public PersonServiceImpl(PersonDao dao) {
+ this.dao = dao;
+ }
+
+ public Person getByName(String name) {
+ return dao.findByName(name);
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/pom.xml b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/pom.xml
new file mode 100644
index 00000000..a76d37e8
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/pom.xml
@@ -0,0 +1,52 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-03-aop-ltw
+ 1.0
+
+
+ 11
+ 11
+ UTF-8
+ 5.3.4
+ 1.9.6
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+
+
+ org.springframework
+ spring-aop
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-instrument
+ ${spring.version}
+
+
+
+ org.aspectj
+ aspectjrt
+ ${aspectj.version}
+
+
+
+ org.aspectj
+ aspectjweaver
+ ${aspectj.version}
+
+
+
+
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/Main.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..bebc1e64
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,31 @@
+package ru.otus.spring;
+
+import org.springframework.context.annotation.*;
+import org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver;
+import org.springframework.instrument.classloading.LoadTimeWeaver;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.service.PersonService;
+
+/*
+Запуск примера:
+ 1. В IDEA, вменю запуска выбираем "Edit Configurations..."
+ 2. В поле "VM options" вносим "-javaagent:${путь.до.m2}\.m2\repository\org\aspectj\aspectjweaver\1.9.6\aspectjweaver-1.9.6.jar",
+ где ${путь.до.m2} это путь до репозитория мавен на текущем компьютере.
+ Пример: "-javaagent:c:\Users\MyUserName\.m2\repository\org\aspectj\aspectjweaver\1.9.6\aspectjweaver-1.9.6.jar".
+ Кавычки не вносим)
+ 3. Запускаем Main
+*/
+
+@Configuration
+@ComponentScan
+public class Main {
+ public static void main(String[] args) {
+ AnnotationConfigApplicationContext context =
+ new AnnotationConfigApplicationContext(Main.class);
+
+ PersonService service = context.getBean(PersonService.class);
+
+ Person ivan = service.getByName("Ivan");
+ System.out.println("name: " + ivan.getName() + " age: " + ivan.getAge());
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/dao/PersonDao.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/dao/PersonDao.java
new file mode 100644
index 00000000..d33939bd
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/dao/PersonDao.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.dao;
+
+import ru.otus.spring.domain.Person;
+
+public interface PersonDao {
+
+ Person findByName(String name);
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java
new file mode 100644
index 00000000..6338ee1a
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java
@@ -0,0 +1,15 @@
+package ru.otus.spring.dao;
+
+import org.springframework.stereotype.Repository;
+import ru.otus.spring.domain.Person;
+
+@Repository
+public class PersonDaoSimple implements PersonDao {
+ public PersonDaoSimple() {
+ System.out.println(this.getClass().getClassLoader());
+ }
+
+ public Person findByName(String name) {
+ return new Person(name, 18);
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/domain/Person.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/domain/Person.java
new file mode 100644
index 00000000..b19b42c1
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/domain/Person.java
@@ -0,0 +1,20 @@
+package ru.otus.spring.domain;
+
+public class Person {
+
+ private String name;
+ private int age;
+
+ public Person(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/logging/LoggingAspect.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/logging/LoggingAspect.java
new file mode 100644
index 00000000..17a56801
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/logging/LoggingAspect.java
@@ -0,0 +1,18 @@
+package ru.otus.spring.logging;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.springframework.stereotype.Component;
+
+@Aspect
+public class LoggingAspect {
+
+ @Before("execution(* ru.otus.spring.dao.PersonDaoSimple.*(..))")
+ public void logBefore(JoinPoint joinPoint) {
+ System.out.println("Прокси : " + joinPoint.getThis().getClass().getName());
+ System.out.println("Класс : " + joinPoint.getTarget().getClass().getName());
+
+ System.out.println("Вызов метода : " + joinPoint.getSignature().getName());
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/service/PersonService.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/service/PersonService.java
new file mode 100644
index 00000000..9b83e7de
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/service/PersonService.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.service;
+
+import ru.otus.spring.domain.Person;
+
+public interface PersonService {
+
+ Person getByName(String name);
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/service/PersonServiceImpl.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/service/PersonServiceImpl.java
new file mode 100644
index 00000000..88b311a5
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/java/ru/otus/spring/service/PersonServiceImpl.java
@@ -0,0 +1,19 @@
+package ru.otus.spring.service;
+
+import org.springframework.stereotype.Service;
+import ru.otus.spring.dao.PersonDao;
+import ru.otus.spring.domain.Person;
+
+@Service
+public class PersonServiceImpl implements PersonService {
+
+ private final PersonDao dao;
+
+ public PersonServiceImpl(PersonDao dao) {
+ this.dao = dao;
+ }
+
+ public Person getByName(String name) {
+ return dao.findByName(name);
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/resources/META-INF/aop.xml b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/resources/META-INF/aop.xml
new file mode 100644
index 00000000..adf0ac99
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-ltw/src/main/resources/META-INF/aop.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/pom.xml b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/pom.xml
new file mode 100644
index 00000000..5356f5b0
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/pom.xml
@@ -0,0 +1,42 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-03-aop-native
+ 1.0
+
+
+ 11
+ 11
+ UTF-8
+ 5.3.4
+ 1.9.6
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-aop
+ ${spring.version}
+
+
+ org.aspectj
+ aspectjrt
+ ${aspectj.version}
+
+
+ org.aspectj
+ aspectjweaver
+ ${aspectj.version}
+
+
+
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/Main.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..1e9380b4
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,20 @@
+package ru.otus.spring;
+
+import org.springframework.context.annotation.*;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.service.PersonService;
+
+@Configuration
+@ComponentScan
+public class Main {
+
+ public static void main(String[] args) {
+ AnnotationConfigApplicationContext context =
+ new AnnotationConfigApplicationContext(Main.class);
+
+ PersonService service = context.getBean(PersonService.class);
+
+ Person ivan = service.getByName("Ivan");
+ System.out.println("name: " + ivan.getName() + " age: " + ivan.getAge());
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/config/CommonNativeAopConfig.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/config/CommonNativeAopConfig.java
new file mode 100644
index 00000000..de391660
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/config/CommonNativeAopConfig.java
@@ -0,0 +1,14 @@
+package ru.otus.spring.config;
+
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+
+@Configuration
+public class CommonNativeAopConfig {
+ @Bean
+ public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
+ return new DefaultAdvisorAutoProxyCreator();
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/config/LoggingAspectConfig.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/config/LoggingAspectConfig.java
new file mode 100644
index 00000000..0fc1f437
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/config/LoggingAspectConfig.java
@@ -0,0 +1,40 @@
+package ru.otus.spring.config;
+
+import org.springframework.aop.ClassFilter;
+import org.springframework.aop.MethodBeforeAdvice;
+import org.springframework.aop.MethodMatcher;
+import org.springframework.aop.Pointcut;
+import org.springframework.aop.support.DefaultPointcutAdvisor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+import ru.otus.spring.dao.PersonDaoSimple;
+
+@Configuration
+public class LoggingAspectConfig {
+
+ public Pointcut personDaoSimpleLoggingAspectPointcut() {
+ return new Pointcut() {
+ @Override
+ public ClassFilter getClassFilter() {
+ return clazz -> clazz.equals(PersonDaoSimple.class);
+ }
+
+ @Override
+ public MethodMatcher getMethodMatcher() {
+ return MethodMatcher.TRUE;
+ }
+ };
+ }
+
+ MethodBeforeAdvice personDaoSimpleLoggingAspectBeforeAdvice() {
+ return (method, objects, o) -> System.out.println("Ура! Вызов метода : " + method.getName());
+ }
+
+
+ @Bean
+ public DefaultPointcutAdvisor personDaoSimpleLoggingAspectAdvisor() {
+ return new DefaultPointcutAdvisor(personDaoSimpleLoggingAspectPointcut(),
+ personDaoSimpleLoggingAspectBeforeAdvice());
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/dao/PersonDao.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/dao/PersonDao.java
new file mode 100644
index 00000000..d33939bd
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/dao/PersonDao.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.dao;
+
+import ru.otus.spring.domain.Person;
+
+public interface PersonDao {
+
+ Person findByName(String name);
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java
new file mode 100644
index 00000000..f8e0bb29
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java
@@ -0,0 +1,12 @@
+package ru.otus.spring.dao;
+
+import org.springframework.stereotype.Repository;
+import ru.otus.spring.domain.Person;
+
+@Repository
+public class PersonDaoSimple implements PersonDao {
+
+ public Person findByName(String name) {
+ return new Person(name, 18);
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/domain/Person.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/domain/Person.java
new file mode 100644
index 00000000..b19b42c1
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/domain/Person.java
@@ -0,0 +1,20 @@
+package ru.otus.spring.domain;
+
+public class Person {
+
+ private String name;
+ private int age;
+
+ public Person(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/service/PersonService.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/service/PersonService.java
new file mode 100644
index 00000000..9b83e7de
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/service/PersonService.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.service;
+
+import ru.otus.spring.domain.Person;
+
+public interface PersonService {
+
+ Person getByName(String name);
+}
diff --git a/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/service/PersonServiceImpl.java b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/service/PersonServiceImpl.java
new file mode 100644
index 00000000..88b311a5
--- /dev/null
+++ b/2021-02/spring-03-aop/spring-03-aop-demo/spring-03-aop-native/src/main/java/ru/otus/spring/service/PersonServiceImpl.java
@@ -0,0 +1,19 @@
+package ru.otus.spring.service;
+
+import org.springframework.stereotype.Service;
+import ru.otus.spring.dao.PersonDao;
+import ru.otus.spring.domain.Person;
+
+@Service
+public class PersonServiceImpl implements PersonService {
+
+ private final PersonDao dao;
+
+ public PersonServiceImpl(PersonDao dao) {
+ this.dao = dao;
+ }
+
+ public Person getByName(String name) {
+ return dao.findByName(name);
+ }
+}