From e2e040604991f28fa82e1ac3d7d7c6264bed388c Mon Sep 17 00:00:00 2001 From: stvort Date: Tue, 7 Jun 2022 02:46:31 +0400 Subject: [PATCH] 2022-05 spring-04-aop added --- .../spring-04-aop/aop-classwork/.gitignore | 24 ++++ .../aop-classwork/exercise/pom.xml | 42 +++++++ .../src/main/java/ru/otus/spring/Main.java | 20 ++++ .../java/ru/otus/spring/dao/PersonDao.java | 8 ++ .../ru/otus/spring/dao/PersonDaoSimple.java | 12 ++ .../java/ru/otus/spring/domain/Person.java | 20 ++++ .../ru/otus/spring/logging/LoggingAspect.java | 13 +++ .../ru/otus/spring/service/PersonService.java | 8 ++ .../spring/service/PersonServiceImpl.java | 19 ++++ 2022-05/spring-04-aop/aop-classwork/pom.xml | 17 +++ .../aop-classwork/solution/pom.xml | 42 +++++++ .../src/main/java/ru/otus/spring/Main.java | 21 ++++ .../java/ru/otus/spring/dao/PersonDao.java | 8 ++ .../ru/otus/spring/dao/PersonDaoSimple.java | 12 ++ .../java/ru/otus/spring/domain/Person.java | 20 ++++ .../ru/otus/spring/logging/LoggingAspect.java | 19 ++++ .../ru/otus/spring/service/PersonService.java | 8 ++ .../spring/service/PersonServiceImpl.java | 19 ++++ 2022-05/spring-04-aop/aop-demo/.gitignore | 24 ++++ .../aop-demo/aop-ctw-plain/exec.sh | 3 + .../aop-demo/aop-ctw-plain/pom.xml | 93 ++++++++++++++++ .../src/main/java/ru/otus/spring/Main.java | 25 +++++ .../java/ru/otus/spring/dao/PersonDao.java | 8 ++ .../ru/otus/spring/dao/PersonDaoSimple.java | 10 ++ .../java/ru/otus/spring/domain/Person.java | 20 ++++ .../ru/otus/spring/logging/LoggingAspect.java | 17 +++ .../ru/otus/spring/service/PersonService.java | 8 ++ .../spring/service/PersonServiceImpl.java | 17 +++ .../spring-04-aop/aop-demo/aop-ctw/exec.sh | 3 + .../spring-04-aop/aop-demo/aop-ctw/pom.xml | 105 ++++++++++++++++++ .../src/main/java/ru/otus/spring/Main.java | 29 +++++ .../java/ru/otus/spring/dao/PersonDao.java | 8 ++ .../ru/otus/spring/dao/PersonDaoSimple.java | 12 ++ .../java/ru/otus/spring/domain/Person.java | 20 ++++ .../ru/otus/spring/logging/LoggingAspect.java | 18 +++ .../ru/otus/spring/service/PersonService.java | 8 ++ .../spring/service/PersonServiceImpl.java | 19 ++++ .../spring-04-aop/aop-demo/aop-custom/pom.xml | 30 +++++ .../src/main/java/ru/otus/demo/Main.java | 47 ++++++++ .../java/ru/otus/demo/aop/LoggingAspect.java | 20 ++++ .../demo/aop/SimpleAOPInvocationHandler.java | 24 ++++ .../ru/otus/demo/aop/SimpleJoinPoint.java | 67 +++++++++++ .../ru/otus/demo/aop/SimpleSignature.java | 43 +++++++ .../java/ru/otus/demo/aop/SimpleWeaver.java | 16 +++ .../main/java/ru/otus/demo/dao/BookDao.java | 8 ++ .../java/ru/otus/demo/dao/BookDaoSimple.java | 10 ++ .../main/java/ru/otus/demo/dao/PersonDao.java | 8 ++ .../ru/otus/demo/dao/PersonDaoSimple.java | 11 ++ .../main/java/ru/otus/demo/domain/Book.java | 14 +++ .../main/java/ru/otus/demo/domain/Person.java | 20 ++++ .../ru/otus/demo/service/BookService.java | 8 ++ .../ru/otus/demo/service/BookServiceImpl.java | 17 +++ .../ru/otus/demo/service/PersonService.java | 8 ++ .../otus/demo/service/PersonServiceImpl.java | 17 +++ .../spring-04-aop/aop-demo/aop-ltw/exec.sh | 3 + .../spring-04-aop/aop-demo/aop-ltw/pom.xml | 80 +++++++++++++ .../src/main/java/ru/otus/spring/Main.java | 31 ++++++ .../java/ru/otus/spring/dao/PersonDao.java | 8 ++ .../ru/otus/spring/dao/PersonDaoSimple.java | 15 +++ .../java/ru/otus/spring/domain/Person.java | 20 ++++ .../ru/otus/spring/logging/LoggingAspect.java | 18 +++ .../ru/otus/spring/service/PersonService.java | 8 ++ .../spring/service/PersonServiceImpl.java | 19 ++++ .../src/main/resources/META-INF/aop.xml | 13 +++ .../spring-04-aop/aop-demo/aop-native/pom.xml | 42 +++++++ .../src/main/java/ru/otus/spring/Main.java | 20 ++++ .../spring/config/CommonNativeAopConfig.java | 14 +++ .../spring/config/LoggingAspectConfig.java | 40 +++++++ .../java/ru/otus/spring/dao/PersonDao.java | 8 ++ .../ru/otus/spring/dao/PersonDaoSimple.java | 12 ++ .../java/ru/otus/spring/domain/Person.java | 20 ++++ .../ru/otus/spring/service/PersonService.java | 8 ++ .../spring/service/PersonServiceImpl.java | 19 ++++ 2022-05/spring-04-aop/aop-demo/pom.xml | 20 ++++ 74 files changed, 1565 insertions(+) create mode 100644 2022-05/spring-04-aop/aop-classwork/.gitignore create mode 100644 2022-05/spring-04-aop/aop-classwork/exercise/pom.xml create mode 100644 2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/Main.java create mode 100644 2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/dao/PersonDao.java create mode 100644 2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java create mode 100644 2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/logging/LoggingAspect.java create mode 100644 2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/service/PersonService.java create mode 100644 2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/service/PersonServiceImpl.java create mode 100644 2022-05/spring-04-aop/aop-classwork/pom.xml create mode 100644 2022-05/spring-04-aop/aop-classwork/solution/pom.xml create mode 100644 2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/Main.java create mode 100644 2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/dao/PersonDao.java create mode 100644 2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java create mode 100644 2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/logging/LoggingAspect.java create mode 100644 2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/service/PersonService.java create mode 100644 2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/service/PersonServiceImpl.java create mode 100644 2022-05/spring-04-aop/aop-demo/.gitignore create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw-plain/exec.sh create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw-plain/pom.xml create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/Main.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/dao/PersonDao.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/logging/LoggingAspect.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/service/PersonService.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/service/PersonServiceImpl.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw/exec.sh create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw/pom.xml create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/Main.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/dao/PersonDao.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/logging/LoggingAspect.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/service/PersonService.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/service/PersonServiceImpl.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/pom.xml create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/Main.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/LoggingAspect.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleAOPInvocationHandler.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleJoinPoint.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleSignature.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleWeaver.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/BookDao.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/BookDaoSimple.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/PersonDao.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/PersonDaoSimple.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/domain/Book.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/domain/Person.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/BookService.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/BookServiceImpl.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/PersonService.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/PersonServiceImpl.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ltw/exec.sh create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ltw/pom.xml create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/Main.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/dao/PersonDao.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/logging/LoggingAspect.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/service/PersonService.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/service/PersonServiceImpl.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/resources/META-INF/aop.xml create mode 100644 2022-05/spring-04-aop/aop-demo/aop-native/pom.xml create mode 100644 2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/Main.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/config/CommonNativeAopConfig.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/config/LoggingAspectConfig.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/dao/PersonDao.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/service/PersonService.java create mode 100644 2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/service/PersonServiceImpl.java create mode 100644 2022-05/spring-04-aop/aop-demo/pom.xml diff --git a/2022-05/spring-04-aop/aop-classwork/.gitignore b/2022-05/spring-04-aop/aop-classwork/.gitignore new file mode 100644 index 00000000..4ea52072 --- /dev/null +++ b/2022-05/spring-04-aop/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/2022-05/spring-04-aop/aop-classwork/exercise/pom.xml b/2022-05/spring-04-aop/aop-classwork/exercise/pom.xml new file mode 100644 index 00000000..f62b12fc --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/exercise/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + ru.otus + exercise + 1.0 + + + 11 + 11 + UTF-8 + 5.3.20 + 1.9.9.1 + + + + + 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/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/Main.java b/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..1e9380b4 --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/dao/PersonDao.java b/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/dao/PersonDao.java new file mode 100644 index 00000000..d33939bd --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java b/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java new file mode 100644 index 00000000..f8e0bb29 --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/domain/Person.java b/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..b19b42c1 --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/logging/LoggingAspect.java b/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/logging/LoggingAspect.java new file mode 100644 index 00000000..4f12dc0c --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/service/PersonService.java b/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/service/PersonService.java new file mode 100644 index 00000000..9b83e7de --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/service/PersonServiceImpl.java b/2022-05/spring-04-aop/aop-classwork/exercise/src/main/java/ru/otus/spring/service/PersonServiceImpl.java new file mode 100644 index 00000000..88b311a5 --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/pom.xml b/2022-05/spring-04-aop/aop-classwork/pom.xml new file mode 100644 index 00000000..2f9b1745 --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + ru.otus + aop-classwork + 1.0 + + pom + + + exercise + solution + + diff --git a/2022-05/spring-04-aop/aop-classwork/solution/pom.xml b/2022-05/spring-04-aop/aop-classwork/solution/pom.xml new file mode 100644 index 00000000..8e51b8cd --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/solution/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + ru.otus + solution + 1.0 + + + 11 + 11 + UTF-8 + 5.3.20 + 1.9.9.1 + + + + + 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/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/Main.java b/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..f4db40b0 --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/dao/PersonDao.java b/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/dao/PersonDao.java new file mode 100644 index 00000000..d33939bd --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java b/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java new file mode 100644 index 00000000..f8e0bb29 --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/domain/Person.java b/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..b19b42c1 --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/logging/LoggingAspect.java b/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/logging/LoggingAspect.java new file mode 100644 index 00000000..a5622c3d --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/service/PersonService.java b/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/service/PersonService.java new file mode 100644 index 00000000..9b83e7de --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/service/PersonServiceImpl.java b/2022-05/spring-04-aop/aop-classwork/solution/src/main/java/ru/otus/spring/service/PersonServiceImpl.java new file mode 100644 index 00000000..88b311a5 --- /dev/null +++ b/2022-05/spring-04-aop/aop-classwork/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/2022-05/spring-04-aop/aop-demo/.gitignore b/2022-05/spring-04-aop/aop-demo/.gitignore new file mode 100644 index 00000000..4ea52072 --- /dev/null +++ b/2022-05/spring-04-aop/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/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/exec.sh b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/exec.sh new file mode 100644 index 00000000..4af59274 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/exec.sh @@ -0,0 +1,3 @@ +mvn clean package +java -jar target/aop-ctw-plain-1.0-jar-with-dependencies.jar +read -p "Press enter to continue" \ No newline at end of file diff --git a/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/pom.xml b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/pom.xml new file mode 100644 index 00000000..101438c3 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/pom.xml @@ -0,0 +1,93 @@ + + + 4.0.0 + + ru.otus + aop-ctw-plain + 1.0 + + + 11 + 11 + UTF-8 + 1.9.9.1 + 1.12.6 + + + + + + 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/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/Main.java b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..307dea7f --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,25 @@ +package ru.otus.spring; + +import ru.otus.spring.dao.PersonDao; +import ru.otus.spring.dao.PersonDaoSimple; +import ru.otus.spring.domain.Person; +import ru.otus.spring.service.PersonService; +import ru.otus.spring.service.PersonServiceImpl; + +/* +Запуск примера: + 1. cd aop-demo/aop-ctw-plain/ + 2. mvn clean package + 3. java -jar target/aop-ctw-plain-1.0-jar-with-dependencies.jar + */ + +public class Main { + + public static void main(String[] args) { + PersonDao personDao = new PersonDaoSimple(); + PersonService service = new PersonServiceImpl(personDao); + + Person ivan = service.getByName("Ivan"); + System.out.println("name: " + ivan.getName() + " age: " + ivan.getAge()); + } +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/dao/PersonDao.java b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/dao/PersonDao.java new file mode 100644 index 00000000..d33939bd --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/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/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java new file mode 100644 index 00000000..7f7c97c6 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java @@ -0,0 +1,10 @@ +package ru.otus.spring.dao; + +import ru.otus.spring.domain.Person; + +public class PersonDaoSimple implements PersonDao { + + public Person findByName(String name) { + return new Person(name, 18); + } +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/domain/Person.java b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..b19b42c1 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/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/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/logging/LoggingAspect.java b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/logging/LoggingAspect.java new file mode 100644 index 00000000..e77adb73 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/logging/LoggingAspect.java @@ -0,0 +1,17 @@ +package ru.otus.spring.logging; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; + +@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/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/service/PersonService.java b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/service/PersonService.java new file mode 100644 index 00000000..9b83e7de --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/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/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/service/PersonServiceImpl.java b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/service/PersonServiceImpl.java new file mode 100644 index 00000000..794c29dd --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ctw-plain/src/main/java/ru/otus/spring/service/PersonServiceImpl.java @@ -0,0 +1,17 @@ +package ru.otus.spring.service; + +import ru.otus.spring.dao.PersonDao; +import ru.otus.spring.domain.Person; + +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/2022-05/spring-04-aop/aop-demo/aop-ctw/exec.sh b/2022-05/spring-04-aop/aop-demo/aop-ctw/exec.sh new file mode 100644 index 00000000..347ebc16 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ctw/exec.sh @@ -0,0 +1,3 @@ +mvn clean package +java -jar target/aop-ctw-1.0-jar-with-dependencies.jar +read -p "Press enter to continue" \ No newline at end of file diff --git a/2022-05/spring-04-aop/aop-demo/aop-ctw/pom.xml b/2022-05/spring-04-aop/aop-demo/aop-ctw/pom.xml new file mode 100644 index 00000000..c3698d67 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ctw/pom.xml @@ -0,0 +1,105 @@ + + + 4.0.0 + + ru.otus + aop-ctw + 1.0 + + + 11 + 11 + UTF-8 + 5.3.20 + 1.9.9.1 + 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/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/Main.java b/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..00c45d28 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,29 @@ +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 aop-demo/aop-ctw/ + 2. mvn clean package + 3. java -jar target/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/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/dao/PersonDao.java b/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/dao/PersonDao.java new file mode 100644 index 00000000..d33939bd --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java b/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java new file mode 100644 index 00000000..f8e0bb29 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/domain/Person.java b/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..b19b42c1 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/logging/LoggingAspect.java b/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/logging/LoggingAspect.java new file mode 100644 index 00000000..17a56801 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/service/PersonService.java b/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/service/PersonService.java new file mode 100644 index 00000000..9b83e7de --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/service/PersonServiceImpl.java b/2022-05/spring-04-aop/aop-demo/aop-ctw/src/main/java/ru/otus/spring/service/PersonServiceImpl.java new file mode 100644 index 00000000..88b311a5 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-custom/pom.xml b/2022-05/spring-04-aop/aop-demo/aop-custom/pom.xml new file mode 100644 index 00000000..5baf4f13 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + ru.otus + aop-custom + 1.0 + + + 11 + 11 + UTF-8 + 1.9.9.1 + + + + + org.aspectj + aspectjrt + ${aspectj.version} + + + org.aspectj + aspectjweaver + ${aspectj.version} + + + diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/Main.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/Main.java new file mode 100644 index 00000000..fc62438c --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/Main.java @@ -0,0 +1,47 @@ +package ru.otus.demo; + +import ru.otus.demo.aop.LoggingAspect; +import ru.otus.demo.dao.BookDao; +import ru.otus.demo.dao.BookDaoSimple; +import ru.otus.demo.dao.PersonDao; +import ru.otus.demo.dao.PersonDaoSimple; +import ru.otus.demo.service.BookService; +import ru.otus.demo.service.BookServiceImpl; +import ru.otus.demo.service.PersonService; +import ru.otus.demo.service.PersonServiceImpl; +import ru.otus.demo.aop.SimpleWeaver; + +import java.util.HashMap; +import java.util.Map; + +public class Main { + + public static void main(String[] args) { + + SimpleWeaver weaver = new SimpleWeaver(); + LoggingAspect aspect = new LoggingAspect(); + + // Как будто контекст с бинами (пока без аспекта) + Map, Object> context = new HashMap<>(); + context.put(PersonDao.class, new PersonDaoSimple()); + context.put(BookDao.class, new BookDaoSimple()); + + // Колхозный вивинг + context.forEach((key, value) -> context.put(key, weaver.weave(value, aspect))); + + // Как будто достаем из контекста дао (уже с примененным аспектом) + PersonDao personDaoProxy = (PersonDao) context.get(PersonDao.class); + BookDao bookDaoProxy = (BookDao) context.get(BookDao.class); + + // Внедряем в сервисы + PersonService personService = new PersonServiceImpl(personDaoProxy); + BookService bookService = new BookServiceImpl(bookDaoProxy); + + // Используем сервисы + personService.getByName("Вася"); + System.out.println("-------------------------------------------------"); + bookService.getByTitle("Укротители велосипедов"); + } + + +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/LoggingAspect.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/LoggingAspect.java new file mode 100644 index 00000000..e8537435 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/LoggingAspect.java @@ -0,0 +1,20 @@ +package ru.otus.demo.aop; + +import org.aspectj.lang.JoinPoint; + +import java.util.Arrays; +import java.util.Objects; +import java.util.stream.Collectors; + +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()); + System.out.println("Аргументы метода : " + Arrays.stream(joinPoint.getArgs()) + .map(Objects::toString) + .collect(Collectors.joining(", "))); + } +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleAOPInvocationHandler.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleAOPInvocationHandler.java new file mode 100644 index 00000000..52489be2 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleAOPInvocationHandler.java @@ -0,0 +1,24 @@ +package ru.otus.demo.aop; + +import org.aspectj.lang.JoinPoint; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +public class SimpleAOPInvocationHandler implements InvocationHandler { + private final Object target; + private final LoggingAspect aspect; + + public SimpleAOPInvocationHandler(Object target, LoggingAspect aspect) { + this.target = target; + this.aspect = aspect; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + JoinPoint joinPoint = new SimpleJoinPoint(target, + proxy, args, method); + aspect.logBefore(joinPoint); + return method.invoke(target, args); + } +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleJoinPoint.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleJoinPoint.java new file mode 100644 index 00000000..b80fd999 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleJoinPoint.java @@ -0,0 +1,67 @@ +package ru.otus.demo.aop; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.reflect.SourceLocation; + +import java.lang.reflect.Method; + +public class SimpleJoinPoint implements JoinPoint { + private final Object targetClass; + private final Object proxyClass; + private final Object[] args; + private final Signature targetMethodSignature; + + public SimpleJoinPoint(Object target, Object proxy, Object[] args, + Method targetMethod) { + this.targetClass = target; + this.proxyClass = proxy; + this.args = args; + this.targetMethodSignature = new SimpleSignature(targetMethod); + } + + @Override + public String toShortString() { + throw new UnsupportedOperationException(); + } + + @Override + public String toLongString() { + throw new UnsupportedOperationException(); + } + + @Override + public Object getThis() { + return proxyClass; + } + + @Override + public Object getTarget() { + return targetClass; + } + + @Override + public Object[] getArgs() { + return args; + } + + @Override + public Signature getSignature() { + return targetMethodSignature; + } + + @Override + public SourceLocation getSourceLocation() { + throw new UnsupportedOperationException(); + } + + @Override + public String getKind() { + throw new UnsupportedOperationException(); + } + + @Override + public StaticPart getStaticPart() { + throw new UnsupportedOperationException(); + } +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleSignature.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleSignature.java new file mode 100644 index 00000000..1a525c24 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleSignature.java @@ -0,0 +1,43 @@ +package ru.otus.demo.aop; + +import org.aspectj.lang.Signature; + +import java.lang.reflect.Method; + +public class SimpleSignature implements Signature { + private final Method targetMethod; + + public SimpleSignature(Method targetMethod) { + this.targetMethod = targetMethod; + } + + @Override + public String toShortString() { + throw new UnsupportedOperationException(); + } + + @Override + public String toLongString() { + throw new UnsupportedOperationException(); + } + + @Override + public String getName() { + return targetMethod.getName(); + } + + @Override + public int getModifiers() { + throw new UnsupportedOperationException(); + } + + @Override + public Class getDeclaringType() { + throw new UnsupportedOperationException(); + } + + @Override + public String getDeclaringTypeName() { + throw new UnsupportedOperationException(); + } +} \ No newline at end of file diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleWeaver.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleWeaver.java new file mode 100644 index 00000000..7e46c016 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/aop/SimpleWeaver.java @@ -0,0 +1,16 @@ +package ru.otus.demo.aop; + +import ru.otus.demo.Main; + +import java.lang.reflect.Proxy; + +public class SimpleWeaver { + @SuppressWarnings("unchecked") + public T weave(T classInstance, LoggingAspect aspect) { + return (T) Proxy.newProxyInstance( + Main.class.getClassLoader(), + classInstance.getClass().getInterfaces(), + new SimpleAOPInvocationHandler(classInstance, aspect) + ); + } +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/BookDao.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/BookDao.java new file mode 100644 index 00000000..17a905ba --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/BookDao.java @@ -0,0 +1,8 @@ +package ru.otus.demo.dao; + +import ru.otus.demo.domain.Book; + +public interface BookDao { + + Book findByTitle(String title); +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/BookDaoSimple.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/BookDaoSimple.java new file mode 100644 index 00000000..56a0b41d --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/BookDaoSimple.java @@ -0,0 +1,10 @@ +package ru.otus.demo.dao; + +import ru.otus.demo.domain.Book; + +public class BookDaoSimple implements BookDao { + @Override + public Book findByTitle(String title) { + return new Book(title); + } +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/PersonDao.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/PersonDao.java new file mode 100644 index 00000000..15563d64 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/PersonDao.java @@ -0,0 +1,8 @@ +package ru.otus.demo.dao; + +import ru.otus.demo.domain.Person; + +public interface PersonDao { + + Person findByName(String name); +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/PersonDaoSimple.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/PersonDaoSimple.java new file mode 100644 index 00000000..7adbfddf --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/dao/PersonDaoSimple.java @@ -0,0 +1,11 @@ +package ru.otus.demo.dao; + +import ru.otus.demo.domain.Person; + + +public class PersonDaoSimple implements PersonDao { + + public Person findByName(String name) { + return new Person(name, 18); + } +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/domain/Book.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/domain/Book.java new file mode 100644 index 00000000..d54a119f --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/domain/Book.java @@ -0,0 +1,14 @@ +package ru.otus.demo.domain; + +public class Book { + + private String title; + + public Book(String name) { + this.title = name; + } + + public String getTitle() { + return title; + } +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/domain/Person.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/domain/Person.java new file mode 100644 index 00000000..80ee7acf --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/domain/Person.java @@ -0,0 +1,20 @@ +package ru.otus.demo.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/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/BookService.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/BookService.java new file mode 100644 index 00000000..713e4e82 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/BookService.java @@ -0,0 +1,8 @@ +package ru.otus.demo.service; + +import ru.otus.demo.domain.Book; + +public interface BookService { + + Book getByTitle(String title); +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/BookServiceImpl.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/BookServiceImpl.java new file mode 100644 index 00000000..713dc0e5 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/BookServiceImpl.java @@ -0,0 +1,17 @@ +package ru.otus.demo.service; + +import ru.otus.demo.dao.BookDao; +import ru.otus.demo.domain.Book; + +public class BookServiceImpl implements BookService { + private final BookDao bookDao; + + public BookServiceImpl(BookDao bookDao) { + this.bookDao = bookDao; + } + + @Override + public Book getByTitle(String title) { + return bookDao.findByTitle(title); + } +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/PersonService.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/PersonService.java new file mode 100644 index 00000000..5a3ae9ab --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/PersonService.java @@ -0,0 +1,8 @@ +package ru.otus.demo.service; + +import ru.otus.demo.domain.Person; + +public interface PersonService { + + Person getByName(String name); +} diff --git a/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/PersonServiceImpl.java b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/PersonServiceImpl.java new file mode 100644 index 00000000..29240b6e --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-custom/src/main/java/ru/otus/demo/service/PersonServiceImpl.java @@ -0,0 +1,17 @@ +package ru.otus.demo.service; + +import ru.otus.demo.dao.PersonDao; +import ru.otus.demo.domain.Person; + +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/2022-05/spring-04-aop/aop-demo/aop-ltw/exec.sh b/2022-05/spring-04-aop/aop-demo/aop-ltw/exec.sh new file mode 100644 index 00000000..3f8a7923 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ltw/exec.sh @@ -0,0 +1,3 @@ +mvn clean package +java -javaagent:c:/Users/User/.m2/repository/org/aspectj/aspectjweaver/1.9.9.1/aspectjweaver-1.9.9.1.jar -jar target/aop-ltw-1.0-jar-with-dependencies.jar +read -p "Press enter to continue" \ No newline at end of file diff --git a/2022-05/spring-04-aop/aop-demo/aop-ltw/pom.xml b/2022-05/spring-04-aop/aop-demo/aop-ltw/pom.xml new file mode 100644 index 00000000..66d05b6c --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ltw/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + ru.otus + aop-ltw + 1.0 + + + 11 + 11 + UTF-8 + 5.3.20 + 1.9.9.1 + + + + + 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} + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + jar-with-dependencies + + + + ru.otus.spring.Main + + + + + + make-assembly + package + + single + + + + + + + diff --git a/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/Main.java b/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..8fbf22c0 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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.8\aspectjweaver-1.9.8.jar", + где ${путь.до.m2} это путь до репозитория мавен на текущем компьютере. + Пример: "-javaagent:c:\Users\MyUserName\.m2\repository\org\aspectj\aspectjweaver\1.9.9.1\aspectjweaver-1.9.9.1.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/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/dao/PersonDao.java b/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/dao/PersonDao.java new file mode 100644 index 00000000..d33939bd --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java b/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java new file mode 100644 index 00000000..6338ee1a --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/domain/Person.java b/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..b19b42c1 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/logging/LoggingAspect.java b/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/logging/LoggingAspect.java new file mode 100644 index 00000000..17a56801 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/service/PersonService.java b/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/service/PersonService.java new file mode 100644 index 00000000..9b83e7de --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/service/PersonServiceImpl.java b/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/java/ru/otus/spring/service/PersonServiceImpl.java new file mode 100644 index 00000000..88b311a5 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/resources/META-INF/aop.xml b/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/resources/META-INF/aop.xml new file mode 100644 index 00000000..adf0ac99 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-ltw/src/main/resources/META-INF/aop.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/2022-05/spring-04-aop/aop-demo/aop-native/pom.xml b/2022-05/spring-04-aop/aop-demo/aop-native/pom.xml new file mode 100644 index 00000000..98bcead1 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/aop-native/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + ru.otus + aop-native + 1.0 + + + 11 + 11 + UTF-8 + 5.3.20 + 1.9.9.1 + + + + + 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/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/Main.java b/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..1e9380b4 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/config/CommonNativeAopConfig.java b/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/config/CommonNativeAopConfig.java new file mode 100644 index 00000000..de391660 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/config/LoggingAspectConfig.java b/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/config/LoggingAspectConfig.java new file mode 100644 index 00000000..0fc1f437 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/dao/PersonDao.java b/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/dao/PersonDao.java new file mode 100644 index 00000000..d33939bd --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java b/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/dao/PersonDaoSimple.java new file mode 100644 index 00000000..f8e0bb29 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/domain/Person.java b/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..b19b42c1 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/service/PersonService.java b/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/service/PersonService.java new file mode 100644 index 00000000..9b83e7de --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/service/PersonServiceImpl.java b/2022-05/spring-04-aop/aop-demo/aop-native/src/main/java/ru/otus/spring/service/PersonServiceImpl.java new file mode 100644 index 00000000..88b311a5 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/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); + } +} diff --git a/2022-05/spring-04-aop/aop-demo/pom.xml b/2022-05/spring-04-aop/aop-demo/pom.xml new file mode 100644 index 00000000..950b1292 --- /dev/null +++ b/2022-05/spring-04-aop/aop-demo/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + ru.otus + aop-demo + 1.0 + + pom + + + aop-ctw + aop-ctw-plain + aop-custom + aop-ltw + aop-native + +