├── README.md
├── src
└── main
│ ├── java
│ └── com
│ │ └── javadoop
│ │ └── springaoplearning
│ │ ├── service
│ │ ├── UserService.java
│ │ ├── OrderService.java
│ │ └── imple
│ │ │ ├── OrderServiceImpl.java
│ │ │ └── UserServiceImpl.java
│ │ ├── aop_spring_2_schema_based
│ │ ├── LogResultAspect.java
│ │ ├── LogArgsAspect.java
│ │ └── SystemArchitecture.java
│ │ ├── aop_spring_1_2
│ │ ├── LogResultAdvice.java
│ │ ├── LogArgsAdvice.java
│ │ ├── UserServiceAfterAdvice.java
│ │ └── UserServiceBeforeAdvice.java
│ │ ├── model
│ │ ├── Order.java
│ │ └── User.java
│ │ ├── aop_spring_2_aspectj
│ │ ├── LogResultAspect.java
│ │ ├── SystemArchitecture.java
│ │ └── LogArgsAspect.java
│ │ └── Application.java
│ └── resources
│ ├── spring_2_0_aspectj.xml
│ ├── spring_1_2_BeanNameAutoProxy.xml
│ ├── spring_1_2_DefaultAdvisorAutoProxy.xml
│ ├── spring_1_2_advice.xml
│ ├── spring_1_2_advisor.xml
│ └── spring_2_0_schema_based.xml
├── .gitignore
└── pom.xml
/README.md:
--------------------------------------------------------------------------------
1 | 博文:[Spring AOP 使用介绍,从前世到今生
2 | ](https://www.javadoop.com/post/spring-aop-intro)
3 |
4 | 打开直接从 Application.java 开始就可以了,要求 Java 8。
5 |
6 | 如果你是 Java 7 环境,请修改下 pom.xml 文件中的配置。
7 |
8 | 另外,也需要修改依赖的 Spring 版本,因为 Spring 5 需要 Java 8 环境,但是本文其实并不是一定要使用 Spring 5.0.0 的。
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/service/UserService.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.service;
2 |
3 | import com.javadoop.springaoplearning.model.User;
4 |
5 |
6 | public interface UserService {
7 |
8 | User createUser(String firstName, String lastName, int age);
9 |
10 | User queryUser();
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/service/OrderService.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.service;
2 |
3 | import com.javadoop.springaoplearning.model.Order;
4 |
5 |
6 | public interface OrderService {
7 |
8 | Order createOrder(String username, String product);
9 |
10 | Order queryOrder(String username);
11 | }
12 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 |
4 | ### STS ###
5 | .apt_generated
6 | .classpath
7 | .factorypath
8 | .project
9 | .settings
10 | .springBeans
11 | .sts4-cache
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | /nbproject/private/
21 | /build/
22 | /nbbuild/
23 | /dist/
24 | /nbdist/
25 | /.nb-gradle/
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/aop_spring_2_schema_based/LogResultAspect.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.aop_spring_2_schema_based;
2 |
3 | /**
4 | * @author: hongjie
5 | * @date: 2018/6/11
6 | */
7 |
8 | public class LogResultAspect {
9 |
10 | public void logResult(Object result) {
11 | System.out.println("[schema-based]返回值:" + result);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/aop_spring_1_2/LogResultAdvice.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.aop_spring_1_2;
2 |
3 | import java.lang.reflect.Method;
4 |
5 | import org.springframework.aop.AfterReturningAdvice;
6 |
7 |
8 | public class LogResultAdvice implements AfterReturningAdvice {
9 |
10 | @Override
11 | public void afterReturning(Object returnValue, Method method, Object[] args, Object target)
12 | throws Throwable {
13 | System.out.println("[advice]方法返回:" + returnValue);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/aop_spring_2_schema_based/LogArgsAspect.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.aop_spring_2_schema_based;
2 |
3 | import java.util.Arrays;
4 |
5 | import org.aspectj.lang.JoinPoint;
6 |
7 | /**
8 | * @author: hongjie
9 | * @date: 2018/6/10
10 | */
11 |
12 | public class LogArgsAspect {
13 |
14 | // 这里可以设置一些自己想要的属性,到时候在配置的时候注入进来
15 |
16 | public void logArgs(JoinPoint joinPoint) {
17 | System.out.println("[schema-based]方法执行前,打印入参:" + Arrays.toString(joinPoint.getArgs()));
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/aop_spring_1_2/LogArgsAdvice.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.aop_spring_1_2;
2 |
3 | import java.lang.reflect.Method;
4 | import java.util.Arrays;
5 |
6 | import org.springframework.aop.MethodBeforeAdvice;
7 |
8 | public class LogArgsAdvice implements MethodBeforeAdvice {
9 |
10 | @Override
11 | public void before(Method method, Object[] args, Object target) throws Throwable {
12 | System.out.println("[advice]准备执行方法: " + method.getName() + ", 参数列表:" + Arrays.toString(args));
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/aop_spring_1_2/UserServiceAfterAdvice.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.aop_spring_1_2;
2 |
3 | import java.lang.reflect.Method;
4 |
5 | import org.springframework.aop.AfterReturningAdvice;
6 |
7 | /**
8 | * @author: hongjie
9 | * @date: 2018/5/29
10 | */
11 | public class UserServiceAfterAdvice implements AfterReturningAdvice {
12 |
13 | @Override
14 | public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
15 | System.out.println("方法返回:" + returnValue);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/aop_spring_1_2/UserServiceBeforeAdvice.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.aop_spring_1_2;
2 |
3 | import java.lang.reflect.Method;
4 | import java.util.Arrays;
5 |
6 | import org.springframework.aop.MethodBeforeAdvice;
7 |
8 | /**
9 | * @author: hongjie
10 | * @date: 2018/5/29
11 | */
12 | public class UserServiceBeforeAdvice implements MethodBeforeAdvice {
13 |
14 | @Override
15 | public void before(Method method, Object[] args, Object target) throws Throwable {
16 | System.out.println("准备执行方法: " + method.getName() + ", 参数:" + Arrays.toString(args));
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/aop_spring_2_schema_based/SystemArchitecture.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.aop_spring_2_schema_based;
2 |
3 | import org.aspectj.lang.annotation.Pointcut;
4 |
5 | public class SystemArchitecture {
6 |
7 | @Pointcut("within(com.javadoop.springaoplearning.web..*)")
8 | public void inWebLayer() {
9 | }
10 |
11 | @Pointcut("within(com.javadoop.springaoplearning.service..*)")
12 | public void inServiceLayer() {
13 | }
14 |
15 | @Pointcut("execution(* com.javadoop.springaoplearning.service.*.*(..))")
16 | public void businessService() {
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/service/imple/OrderServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.service.imple;
2 |
3 | import com.javadoop.springaoplearning.model.Order;
4 | import com.javadoop.springaoplearning.service.OrderService;
5 |
6 | public class OrderServiceImpl implements OrderService {
7 |
8 |
9 | @Override
10 | public Order createOrder(String username, String product) {
11 | Order order = new Order();
12 | order.setUsername(username);
13 | order.setProduct(product);
14 | return order;
15 | }
16 |
17 | @Override
18 | public Order queryOrder(String username) {
19 | Order order = new Order();
20 | order.setUsername("test");
21 | order.setProduct("test");
22 | return order;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/model/Order.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.model;
2 |
3 |
4 | public class Order {
5 |
6 | private String username;
7 |
8 | private String product;
9 |
10 | public String getUsername() {
11 | return username;
12 | }
13 |
14 | public void setUsername(String username) {
15 | this.username = username;
16 | }
17 |
18 | public String getProduct() {
19 | return product;
20 | }
21 |
22 | public void setProduct(String product) {
23 | this.product = product;
24 | }
25 |
26 | @Override
27 | public String toString() {
28 | return "Order{" +
29 | "username='" + username + '\'' +
30 | ", product='" + product + '\'' +
31 | '}';
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/aop_spring_2_aspectj/LogResultAspect.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.aop_spring_2_aspectj;
2 |
3 | import org.aspectj.lang.annotation.AfterReturning;
4 | import org.aspectj.lang.annotation.Aspect;
5 |
6 | /**
7 | * @author: hongjie
8 | * @date: 2018/6/11
9 | */
10 |
11 | @Aspect
12 | public class LogResultAspect {
13 |
14 | private boolean trace;
15 |
16 | @AfterReturning(pointcut = "com.javadoop.springaoplearning.aop_spring_2_aspectj.SystemArchitecture.businessService()",
17 | returning = "result")
18 | public void logResult(Object result) {
19 | if (trace) {
20 | System.out.println("[@AspectJ]返回值:" + result);
21 | }
22 | }
23 |
24 | public void setTrace(boolean trace) {
25 | this.trace = trace;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/service/imple/UserServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.service.imple;
2 |
3 | import com.javadoop.springaoplearning.model.User;
4 | import com.javadoop.springaoplearning.service.UserService;
5 |
6 |
7 | public class UserServiceImpl implements UserService {
8 |
9 | @Override
10 | public User createUser(String firstName, String lastName, int age) {
11 | User user = new User();
12 | user.setFirstName(firstName);
13 | user.setLastName(lastName);
14 | user.setAge(age);
15 | return user;
16 | }
17 |
18 | @Override
19 | public User queryUser() {
20 | User user = new User();
21 | user.setFirstName("test");
22 | user.setLastName("test");
23 | user.setAge(20);
24 | return user;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/aop_spring_2_aspectj/SystemArchitecture.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.aop_spring_2_aspectj;
2 |
3 | import org.aspectj.lang.annotation.Aspect;
4 | import org.aspectj.lang.annotation.Pointcut;
5 |
6 | @Aspect
7 | public class SystemArchitecture {
8 |
9 | @Pointcut("within(com.javadoop.springaoplearning.web..*)")
10 | public void inWebLayer() {}
11 |
12 | @Pointcut("within(com.javadoop.springaoplearning.service..*)")
13 | public void inServiceLayer() {}
14 |
15 | // @Pointcut("within(com.javadoop.springaoplearning.dao..*)")
16 | // public void inDataAccessLayer() {}
17 |
18 | @Pointcut("execution(* com.javadoop.springaoplearning.service.*.*(..))")
19 | public void businessService() {}
20 |
21 | // @Pointcut("execution(* com.javadoop.springaoplearning.dao.*.*(..))")
22 | // public void dataAccessOperation() {}
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/aop_spring_2_aspectj/LogArgsAspect.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.aop_spring_2_aspectj;
2 |
3 | import java.util.Arrays;
4 |
5 | import org.aspectj.lang.JoinPoint;
6 | import org.aspectj.lang.annotation.Aspect;
7 | import org.aspectj.lang.annotation.Before;
8 | import org.springframework.stereotype.Component;
9 |
10 | /**
11 | * @author: hongjie
12 | * @date: 2018/6/10
13 | */
14 |
15 | @Aspect
16 | public class LogArgsAspect {
17 |
18 | // 这里可以设置一些自己想要的属性,到时候在配置的时候注入进来
19 | private boolean trace = true;
20 |
21 | @Before("com.javadoop.springaoplearning.aop_spring_2_aspectj.SystemArchitecture.businessService()")
22 | public void logArgs(JoinPoint joinPoint) {
23 | if (trace) {
24 | System.out.println("[@AspectJ]方法执行前,打印入参:" + Arrays.toString(joinPoint.getArgs()));
25 | }
26 | }
27 |
28 | public void setTrace(boolean trace) {
29 | this.trace = trace;
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/resources/spring_2_0_aspectj.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/src/main/resources/spring_1_2_BeanNameAutoProxy.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | logArgsAdvice
18 | logResultAdvice
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/model/User.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning.model;
2 |
3 | public class User {
4 |
5 | private String firstName;
6 |
7 | private String lastName;
8 |
9 | private int age;
10 |
11 | private String address;
12 |
13 | public String getFirstName() {
14 | return firstName;
15 | }
16 |
17 | public void setFirstName(String firstName) {
18 | this.firstName = firstName;
19 | }
20 |
21 | public String getLastName() {
22 | return lastName;
23 | }
24 |
25 | public void setLastName(String lastName) {
26 | this.lastName = lastName;
27 | }
28 |
29 | public int getAge() {
30 | return age;
31 | }
32 |
33 | public void setAge(int age) {
34 | this.age = age;
35 | }
36 |
37 | public String getAddress() {
38 | return address;
39 | }
40 |
41 | public void setAddress(String address) {
42 | this.address = address;
43 | }
44 |
45 | @Override
46 | public String toString() {
47 | return "User{" +
48 | "firstName='" + firstName + '\'' +
49 | ", lastName='" + lastName + '\'' +
50 | ", age=" + age +
51 | ", address='" + address + '\'' +
52 | '}';
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/main/resources/spring_1_2_DefaultAdvisorAutoProxy.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/main/resources/spring_1_2_advice.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | com.javadoop.springaoplearning.service.UserService
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | logArgsAdvice
28 | logResultAdvice
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/main/resources/spring_1_2_advisor.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | com.javadoop.springaoplearning.service.UserService
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | logCreateAdvisor
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/main/resources/spring_2_0_schema_based.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.javadoop
7 | spring-aop-learning
8 | 1.0
9 | jar
10 |
11 |
12 |
13 | UTF-8
14 | UTF-8
15 | 1.8
16 |
17 |
18 |
19 |
20 |
21 | org.springframework
22 | spring-aop
23 | 5.0.0.RELEASE
24 |
25 |
26 |
27 | org.springframework
28 | spring-context
29 | 5.0.0.RELEASE
30 |
31 |
32 |
33 | org.aspectj
34 | aspectjweaver
35 | 1.8.13
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | org.apache.maven.plugins
44 | maven-compiler-plugin
45 | 2.3.2
46 |
47 | ${java.version}
48 | ${java.version}
49 |
50 |
51 |
52 |
53 |
54 | maven-assembly-plugin
55 | 2.6
56 |
57 |
58 | jar-with-dependencies
59 |
60 |
61 |
62 | com.javadoop.springaoplearning.Application
63 |
64 |
65 |
66 |
67 |
68 | make-assembly
69 | package
70 |
71 | single
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
--------------------------------------------------------------------------------
/src/main/java/com/javadoop/springaoplearning/Application.java:
--------------------------------------------------------------------------------
1 | package com.javadoop.springaoplearning;
2 |
3 | import org.springframework.context.ApplicationContext;
4 | import org.springframework.context.support.ClassPathXmlApplicationContext;
5 |
6 | import com.javadoop.springaoplearning.service.OrderService;
7 | import com.javadoop.springaoplearning.service.UserService;
8 |
9 | /**
10 | * @author: hongjie
11 | * @date: 2018/6/18
12 | */
13 |
14 | public class Application {
15 |
16 | public static void main(String[] args) {
17 |
18 | test_Spring_1_2_Advice();
19 | // test_Spring_1_2_Advisor();
20 | // test_Spring_1_2_BeanNameAutoProxy();
21 | // test_Spring_1_2_DefaultAdvisorAutoProxy();
22 | // test_Spring_2_0_AspectJ();
23 | // test_Spring_2_0_Schema_Based();
24 | }
25 |
26 |
27 | public static void test_Spring_1_2_Advice() {
28 |
29 | // 启动 Spring 的 IOC 容器
30 | ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring_1_2_advice.xml");
31 |
32 | // 我们这里要取 AOP 代理:userServiceProxy,这非常重要
33 | UserService userService = (UserService) context.getBean("userServiceProxy");
34 |
35 | userService.createUser("Tom", "Cruise", 55);
36 | userService.queryUser();
37 | }
38 |
39 | public static void test_Spring_1_2_Advisor() {
40 |
41 | // 启动 Spring 的 IOC 容器
42 | ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring_1_2_advisor.xml");
43 |
44 | // 我们这里要取 AOP 代理:userServiceProxy,这非常重要
45 | UserService userService = (UserService) context.getBean("userServiceProxy");
46 |
47 | userService.createUser("Tom", "Cruise", 55);
48 | userService.queryUser();
49 | }
50 |
51 | public static void test_Spring_1_2_BeanNameAutoProxy() {
52 |
53 | // 启动 Spring 的 IOC 容器
54 | ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring_1_2_BeanNameAutoProxy.xml");
55 |
56 | // 注意这里,不再需要根据代理找 bean
57 | UserService userService = context.getBean(UserService.class);
58 | OrderService orderService = context.getBean(OrderService.class);
59 |
60 | userService.createUser("Tom", "Cruise", 55);
61 | userService.queryUser();
62 |
63 | orderService.createOrder("Leo", "随便买点什么");
64 | orderService.queryOrder("Leo");
65 | }
66 |
67 | public static void test_Spring_1_2_DefaultAdvisorAutoProxy() {
68 |
69 | // 启动 Spring 的 IOC 容器
70 | ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring_1_2_DefaultAdvisorAutoProxy.xml");
71 |
72 | UserService userService = context.getBean(UserService.class);
73 | OrderService orderService = context.getBean(OrderService.class);
74 |
75 | userService.createUser("Tom", "Cruise", 55);
76 | userService.queryUser();
77 |
78 | orderService.createOrder("Leo", "随便买点什么");
79 | orderService.queryOrder("Leo");
80 | }
81 |
82 | public static void test_Spring_2_0_AspectJ() {
83 |
84 | // 启动 Spring 的 IOC 容器
85 | ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring_2_0_aspectj.xml");
86 |
87 | UserService userService = context.getBean(UserService.class);
88 |
89 | userService.createUser("Tom", "Cruise", 55);
90 | userService.queryUser();
91 | }
92 |
93 | public static void test_Spring_2_0_Schema_Based() {
94 |
95 | // 启动 Spring 的 IOC 容器
96 | ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring_2_0_schema_based.xml");
97 |
98 | UserService userService = context.getBean(UserService.class);
99 |
100 | userService.createUser("Tom", "Cruise", 55);
101 | }
102 |
103 |
104 | }
105 |
--------------------------------------------------------------------------------