├── 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 | --------------------------------------------------------------------------------