2022-02 spring-04-aop added

This commit is contained in:
stvort
2022-03-11 15:58:31 +04:00
parent c5ed49c327
commit d71dda57ea
57 changed files with 1196 additions and 0 deletions
@@ -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/
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>exercise</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.3.16</spring.version>
<aspectj.version>1.9.8</aspectj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<!-- можно не писать - она транзитивна spring-context -->
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</project>
@@ -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());
}
}
@@ -0,0 +1,8 @@
package ru.otus.spring.dao;
import ru.otus.spring.domain.Person;
public interface PersonDao {
Person findByName(String name);
}
@@ -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);
}
}
@@ -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;
}
}
@@ -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());
}
}
@@ -0,0 +1,8 @@
package ru.otus.spring.service;
import ru.otus.spring.domain.Person;
public interface PersonService {
Person getByName(String name);
}
@@ -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);
}
}
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>aop-classwork</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>exercise</module>
<module>solution</module>
</modules>
</project>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>solution</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.3.16</spring.version>
<aspectj.version>1.9.8</aspectj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<!-- можно не писать - она транзитивна spring-context -->
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</project>
@@ -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());
}
}
@@ -0,0 +1,8 @@
package ru.otus.spring.dao;
import ru.otus.spring.domain.Person;
public interface PersonDao {
Person findByName(String name);
}
@@ -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);
}
}
@@ -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;
}
}
@@ -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());
}
}
@@ -0,0 +1,8 @@
package ru.otus.spring.service;
import ru.otus.spring.domain.Person;
public interface PersonService {
Person getByName(String name);
}
@@ -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);
}
}
+24
View File
@@ -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/
@@ -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"
@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>aop-ctw-plain</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<aspectj.version>1.9.8</aspectj.version>
<aspectj.plugin.version>1.12.6</aspectj.plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>com.nickwongdev</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>${aspectj.plugin.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>ru.otus.spring.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.nickwongdev</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>${aspectj.plugin.version}</version>
<configuration>
<complianceLevel>11</complianceLevel>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<showWeaveInfo>true</showWeaveInfo>
<verbose>true</verbose>
<Xlint>ignore</Xlint>
<encoding>UTF-8 </encoding>
<weaveDirectories>
<weaveDirectory>${project.build.directory}/classes</weaveDirectory>
</weaveDirectories>
<forceAjcCompile>true</forceAjcCompile>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<!-- <goal>test-compile</goal> -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
@@ -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());
}
}
@@ -0,0 +1,8 @@
package ru.otus.spring.dao;
import ru.otus.spring.domain.Person;
public interface PersonDao {
Person findByName(String name);
}
@@ -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);
}
}
@@ -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;
}
}
@@ -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());
}
}
@@ -0,0 +1,8 @@
package ru.otus.spring.service;
import ru.otus.spring.domain.Person;
public interface PersonService {
Person getByName(String name);
}
@@ -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);
}
}
@@ -0,0 +1,3 @@
mvn clean package
java -jar target/aop-ctw-1.0-jar-with-dependencies.jar
read -p "Press enter to continue"
@@ -0,0 +1,105 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>aop-ctw</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.3.16</spring.version>
<aspectj.version>1.9.8</aspectj.version>
<aspectj.plugin.version>1.12.6</aspectj.plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<!-- можно не писать - она транзитивна spring-context -->
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>com.nickwongdev</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>${aspectj.plugin.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>ru.otus.spring.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.nickwongdev</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>${aspectj.plugin.version}</version>
<configuration>
<complianceLevel>11</complianceLevel>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<showWeaveInfo>true</showWeaveInfo>
<verbose>true</verbose>
<Xlint>ignore</Xlint>
<encoding>UTF-8 </encoding>
<weaveDirectories>
<weaveDirectory>${project.build.directory}/classes</weaveDirectory>
</weaveDirectories>
<forceAjcCompile>true</forceAjcCompile>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<!-- <goal>test-compile</goal> -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
@@ -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());
}
}
@@ -0,0 +1,8 @@
package ru.otus.spring.dao;
import ru.otus.spring.domain.Person;
public interface PersonDao {
Person findByName(String name);
}
@@ -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);
}
}
@@ -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;
}
}
@@ -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());
}
}
@@ -0,0 +1,8 @@
package ru.otus.spring.service;
import ru.otus.spring.domain.Person;
public interface PersonService {
Person getByName(String name);
}
@@ -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);
}
}
@@ -0,0 +1,3 @@
mvn clean package
java -javaagent:c:/Users/User/.m2/repository/org/aspectj/aspectjweaver/1.9.8/aspectjweaver-1.9.8.jar -jar target/aop-ltw-1.0-jar-with-dependencies.jar
read -p "Press enter to continue"
@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>aop-ltw</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.3.16</spring.version>
<aspectj.version>1.9.8</aspectj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<!-- можно не писать - она транзитивна spring-context -->
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>ru.otus.spring.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
@@ -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.8\aspectjweaver-1.9.8.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());
}
}
@@ -0,0 +1,8 @@
package ru.otus.spring.dao;
import ru.otus.spring.domain.Person;
public interface PersonDao {
Person findByName(String name);
}
@@ -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);
}
}
@@ -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;
}
}
@@ -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());
}
}
@@ -0,0 +1,8 @@
package ru.otus.spring.service;
import ru.otus.spring.domain.Person;
public interface PersonService {
Person getByName(String name);
}
@@ -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);
}
}
@@ -0,0 +1,13 @@
<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "https://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<weaver options="-showWeaveInfo -verbose">
<include within="ru.otus.spring.dao.*"/>
<include within="ru.otus.spring.logging.*"/>
</weaver>
<aspects>
<aspect name="ru.otus.spring.logging.LoggingAspect"/>
</aspects>
</aspectj>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>aop-native</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.3.16</spring.version>
<aspectj.version>1.9.8</aspectj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<!-- можно не писать - она транзитивна spring-context -->
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</project>
@@ -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());
}
}
@@ -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();
}
}
@@ -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());
}
}
@@ -0,0 +1,8 @@
package ru.otus.spring.dao;
import ru.otus.spring.domain.Person;
public interface PersonDao {
Person findByName(String name);
}
@@ -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);
}
}
@@ -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;
}
}
@@ -0,0 +1,8 @@
package ru.otus.spring.service;
import ru.otus.spring.domain.Person;
public interface PersonService {
Person getByName(String name);
}
@@ -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);
}
}
+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.otus</groupId>
<artifactId>aop-demo</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>aop-ctw</module>
<module>aop-ctw-plain</module>
<module>aop-ltw</module>
<module>aop-native</module>
</modules>
</project>