From 3cda29d3b9f4f94b1339b8d06c3636c1103bf6fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com>
Date: Fri, 28 Dec 2018 18:01:03 +0800
Subject: [PATCH] update
---
spring/spring-aop-annotation/pom.xml | 63 +++++++++++++++++++
.../com/heibaiying/advice/CustomAdvice.java | 61 ++++++++++++++++++
.../com/heibaiying/advice/FirstAdvice.java | 50 +++++++++++++++
.../com/heibaiying/advice/SecondAdvice.java | 48 ++++++++++++++
.../main/java/com/heibaiying/bean/Order.java | 24 +++++++
.../java/com/heibaiying/config/AopConfig.java | 15 +++++
.../com/heibaiying/service/OrderService.java | 16 +++++
.../heibaiying/service/OrderServiceImpl.java | 28 +++++++++
.../test/java/com/heibaiying/aop/AopTest.java | 35 +++++++++++
spring/spring-aop/pom.xml | 63 +++++++++++++++++++
.../com/heibaiying/advice/CustomAdvice.java | 48 ++++++++++++++
.../main/java/com/heibaiying/bean/Order.java | 24 +++++++
.../com/heibaiying/service/OrderService.java | 16 +++++
.../heibaiying/service/OrderServiceImpl.java | 22 +++++++
spring/spring-aop/src/main/resources/aop.xml | 35 +++++++++++
.../test/java/com/heibaiying/aop/AopTest.java | 27 ++++++++
16 files changed, 575 insertions(+)
create mode 100644 spring/spring-aop-annotation/pom.xml
create mode 100644 spring/spring-aop-annotation/src/main/java/com/heibaiying/advice/CustomAdvice.java
create mode 100644 spring/spring-aop-annotation/src/main/java/com/heibaiying/advice/FirstAdvice.java
create mode 100644 spring/spring-aop-annotation/src/main/java/com/heibaiying/advice/SecondAdvice.java
create mode 100644 spring/spring-aop-annotation/src/main/java/com/heibaiying/bean/Order.java
create mode 100644 spring/spring-aop-annotation/src/main/java/com/heibaiying/config/AopConfig.java
create mode 100644 spring/spring-aop-annotation/src/main/java/com/heibaiying/service/OrderService.java
create mode 100644 spring/spring-aop-annotation/src/main/java/com/heibaiying/service/OrderServiceImpl.java
create mode 100644 spring/spring-aop-annotation/src/test/java/com/heibaiying/aop/AopTest.java
create mode 100644 spring/spring-aop/pom.xml
create mode 100644 spring/spring-aop/src/main/java/com/heibaiying/advice/CustomAdvice.java
create mode 100644 spring/spring-aop/src/main/java/com/heibaiying/bean/Order.java
create mode 100644 spring/spring-aop/src/main/java/com/heibaiying/service/OrderService.java
create mode 100644 spring/spring-aop/src/main/java/com/heibaiying/service/OrderServiceImpl.java
create mode 100644 spring/spring-aop/src/main/resources/aop.xml
create mode 100644 spring/spring-aop/src/test/java/com/heibaiying/aop/AopTest.java
diff --git a/spring/spring-aop-annotation/pom.xml b/spring/spring-aop-annotation/pom.xml
new file mode 100644
index 0000000..a59f2d9
--- /dev/null
+++ b/spring/spring-aop-annotation/pom.xml
@@ -0,0 +1,63 @@
+
+
+ 4.0.0
+
+ com.heibaiying
+ spring-aop
+ 1.0-SNAPSHOT
+
+
+ 5.1.3.RELEASE
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-beans
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-core
+ ${spring-base-version}
+
+
+
+ org.springframework
+ spring-aop
+ ${spring-base-version}
+
+
+ org.aspectj
+ aspectjweaver
+ 1.9.2
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.springframework
+ spring-test
+ ${spring-base-version}
+ test
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-aop-annotation/src/main/java/com/heibaiying/advice/CustomAdvice.java b/spring/spring-aop-annotation/src/main/java/com/heibaiying/advice/CustomAdvice.java
new file mode 100644
index 0000000..eaa002e
--- /dev/null
+++ b/spring/spring-aop-annotation/src/main/java/com/heibaiying/advice/CustomAdvice.java
@@ -0,0 +1,61 @@
+package com.heibaiying.advice;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+
+/**
+ * @author : heibaiying
+ * @description : 自定义切面
+ */
+@Aspect
+@Component //除了加上@Aspect外 还需要声明为spring的组件 @Aspect只是一个切面声明
+public class CustomAdvice {
+
+
+ /**
+ * 使用 || , or 表示或
+ * 使用 && , and 表示与
+ * ! 表示非
+ */
+ @Pointcut("execution(* com.heibaiying.service.OrderService.*(..)) && !execution(* com.heibaiying.service.OrderService.deleteOrder(..))")
+ private void pointCut() {
+
+ }
+
+ @Before("pointCut()")
+ public void before(JoinPoint joinPoint) {
+ //获取节点名称
+ String name = joinPoint.getSignature().getName();
+ Object[] args = joinPoint.getArgs();
+ System.out.println(name + "方法调用前:获取调用参数" + Arrays.toString(args));
+ }
+
+ @AfterReturning(pointcut = "pointCut()", returning = "result")
+ public void afterReturning(JoinPoint joinPoint, Object result) {
+ System.out.println("后置返回通知结果" + result);
+ }
+
+ @Around("pointCut()")
+ public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
+ System.out.println("环绕通知-前");
+ //调用目标方法
+ Object proceed = joinPoint.proceed();
+ System.out.println("环绕通知-后");
+ return proceed;
+ }
+
+ @AfterThrowing(pointcut = "pointCut()", throwing = "exception")
+ public void afterThrowing(JoinPoint joinPoint, Exception exception) {
+ System.err.println("后置异常通知:" + exception);
+ }
+
+
+ @After("pointCut()")
+ public void after(JoinPoint joinPoint) {
+ System.out.println("后置通知");
+ }
+}
diff --git a/spring/spring-aop-annotation/src/main/java/com/heibaiying/advice/FirstAdvice.java b/spring/spring-aop-annotation/src/main/java/com/heibaiying/advice/FirstAdvice.java
new file mode 100644
index 0000000..6ed75eb
--- /dev/null
+++ b/spring/spring-aop-annotation/src/main/java/com/heibaiying/advice/FirstAdvice.java
@@ -0,0 +1,50 @@
+package com.heibaiying.advice;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+
+/**
+ * @author : heibaiying
+ * @description : 自定义切面
+ */
+@Order(1)
+@Aspect
+@Component
+public class FirstAdvice {
+
+
+ @Pointcut("execution(* com.heibaiying.service.OrderService.deleteOrder(..)))")
+ private void pointCut() {
+
+ }
+
+ @Before("pointCut()")
+ public void before(JoinPoint joinPoint) {
+ System.out.println("第一个切面的before");
+ }
+
+ @AfterReturning(pointcut = "pointCut()", returning = "result")
+ public void afterReturning(JoinPoint joinPoint, Object result) {
+ System.out.println("第一个切面的AfterReturning");
+ }
+
+ @Around("pointCut()")
+ public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
+ System.out.println("第一个切面环绕通知-前");
+ //调用目标方法
+ Object proceed = joinPoint.proceed();
+ System.out.println("第一个切面环绕通知-后");
+ return proceed;
+ }
+
+
+ @After("pointCut()")
+ public void after(JoinPoint joinPoint) {
+ System.out.println("第一个切面后置通知");
+ }
+}
diff --git a/spring/spring-aop-annotation/src/main/java/com/heibaiying/advice/SecondAdvice.java b/spring/spring-aop-annotation/src/main/java/com/heibaiying/advice/SecondAdvice.java
new file mode 100644
index 0000000..6d48b41
--- /dev/null
+++ b/spring/spring-aop-annotation/src/main/java/com/heibaiying/advice/SecondAdvice.java
@@ -0,0 +1,48 @@
+package com.heibaiying.advice;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author : heibaiying
+ * @description : 自定义切面
+ */
+@Order(1)
+@Aspect
+@Component
+public class SecondAdvice {
+
+
+ @Pointcut("execution(* com.heibaiying.service.OrderService.deleteOrder(..)))")
+ private void pointCut() {
+
+ }
+
+ @Before("pointCut()")
+ public void before(JoinPoint joinPoint) {
+ System.out.println("第二个切面的before");
+ }
+
+ @AfterReturning(pointcut = "pointCut()", returning = "result")
+ public void afterReturning(JoinPoint joinPoint, Object result) {
+ System.out.println("第二个切面的AfterReturning");
+ }
+
+ @Around("pointCut()")
+ public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
+ System.out.println("第二个切面环绕通知-前");
+ //调用目标方法
+ Object proceed = joinPoint.proceed();
+ System.out.println("第二个切面环绕通知-后");
+ return proceed;
+ }
+
+
+ @After("pointCut()")
+ public void after(JoinPoint joinPoint) {
+ System.out.println("第二个切面后置通知");
+ }
+}
diff --git a/spring/spring-aop-annotation/src/main/java/com/heibaiying/bean/Order.java b/spring/spring-aop-annotation/src/main/java/com/heibaiying/bean/Order.java
new file mode 100644
index 0000000..8b1245c
--- /dev/null
+++ b/spring/spring-aop-annotation/src/main/java/com/heibaiying/bean/Order.java
@@ -0,0 +1,24 @@
+package com.heibaiying.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description : 订单实体类
+ */
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Order {
+
+ private long id;
+
+ private String productName;
+
+ private Date orderTime;
+}
diff --git a/spring/spring-aop-annotation/src/main/java/com/heibaiying/config/AopConfig.java b/spring/spring-aop-annotation/src/main/java/com/heibaiying/config/AopConfig.java
new file mode 100644
index 0000000..4435b5d
--- /dev/null
+++ b/spring/spring-aop-annotation/src/main/java/com/heibaiying/config/AopConfig.java
@@ -0,0 +1,15 @@
+package com.heibaiying.config;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+
+/**
+ * @author : heibaiying
+ * @description : 开启切面配置
+ */
+@Configuration
+@ComponentScan("com.heibaiying.*")
+@EnableAspectJAutoProxy // 开启@Aspect注解支持 等价于
+public class AopConfig {
+}
diff --git a/spring/spring-aop-annotation/src/main/java/com/heibaiying/service/OrderService.java b/spring/spring-aop-annotation/src/main/java/com/heibaiying/service/OrderService.java
new file mode 100644
index 0000000..6a90f4d
--- /dev/null
+++ b/spring/spring-aop-annotation/src/main/java/com/heibaiying/service/OrderService.java
@@ -0,0 +1,16 @@
+package com.heibaiying.service;
+
+import com.heibaiying.bean.Order;
+
+/**
+ * @author : heibaiying
+ * @description : 订单查询接口
+ */
+public interface OrderService {
+
+ Order queryOrder(Long id);
+
+ Order createOrder(Long id, String productName);
+
+ boolean deleteOrder(Long id);
+}
diff --git a/spring/spring-aop-annotation/src/main/java/com/heibaiying/service/OrderServiceImpl.java b/spring/spring-aop-annotation/src/main/java/com/heibaiying/service/OrderServiceImpl.java
new file mode 100644
index 0000000..f959df2
--- /dev/null
+++ b/spring/spring-aop-annotation/src/main/java/com/heibaiying/service/OrderServiceImpl.java
@@ -0,0 +1,28 @@
+package com.heibaiying.service;
+
+import com.heibaiying.bean.Order;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description : 订单查询接口实现类
+ */
+@Service
+public class OrderServiceImpl implements OrderService {
+
+ public Order queryOrder(Long id) {
+ return new Order(id, "product", new Date());
+ }
+
+ public Order createOrder(Long id, String productName) {
+ // 模拟抛出异常
+ // int j = 1 / 0;
+ return new Order(id, "new Product", new Date());
+ }
+
+ public boolean deleteOrder(Long id) {
+ return true;
+ }
+}
diff --git a/spring/spring-aop-annotation/src/test/java/com/heibaiying/aop/AopTest.java b/spring/spring-aop-annotation/src/test/java/com/heibaiying/aop/AopTest.java
new file mode 100644
index 0000000..4d7c4f0
--- /dev/null
+++ b/spring/spring-aop-annotation/src/test/java/com/heibaiying/aop/AopTest.java
@@ -0,0 +1,35 @@
+package com.heibaiying.aop;
+
+import com.heibaiying.config.AopConfig;
+import com.heibaiying.service.OrderService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author : heibaiying
+ * @description : 关于多个切面在同一个切入点上执行顺序的例子 可以在spring-aop-annotation 中查看
+ */
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = AopConfig.class)
+public class AopTest {
+
+
+ @Autowired
+ private OrderService orderService;
+
+ @Test
+ public void saveAndQuery() {
+ orderService.createOrder(1283929319L, "手机");
+ //orderService.queryOrder(4891894129L);
+ }
+
+ @Test
+ public void delete() {
+ orderService.deleteOrder(12793179L);
+ }
+}
diff --git a/spring/spring-aop/pom.xml b/spring/spring-aop/pom.xml
new file mode 100644
index 0000000..8b74431
--- /dev/null
+++ b/spring/spring-aop/pom.xml
@@ -0,0 +1,63 @@
+
+
+ 4.0.0
+
+ com.heibaiying
+ spring-aop
+ 1.0-SNAPSHOT
+
+
+ 5.1.3.RELEASE
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-beans
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-core
+ ${spring-base-version}
+
+
+
+ org.springframework
+ spring-aop
+ ${spring-base-version}
+
+
+ org.aspectj
+ aspectjweaver
+ 1.9.2
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.springframework
+ spring-test
+ ${spring-base-version}
+ test
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-aop/src/main/java/com/heibaiying/advice/CustomAdvice.java b/spring/spring-aop/src/main/java/com/heibaiying/advice/CustomAdvice.java
new file mode 100644
index 0000000..602c440
--- /dev/null
+++ b/spring/spring-aop/src/main/java/com/heibaiying/advice/CustomAdvice.java
@@ -0,0 +1,48 @@
+package com.heibaiying.advice;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+
+import java.util.Arrays;
+
+/**
+ * @author : heibaiying
+ * @description : 自定义切面
+ */
+public class CustomAdvice {
+
+
+ //前置通知
+ public void before(JoinPoint joinPoint) {
+ //获取节点名称
+ String name = joinPoint.getSignature().getName();
+ Object[] args = joinPoint.getArgs();
+ System.out.println(name + "方法调用前:获取调用参数" + Arrays.toString(args));
+ }
+
+ //后置通知(抛出异常后不会被执行)
+ public void afterReturning(JoinPoint joinPoint, Object result) {
+ System.out.println("后置返回通知结果" + result);
+ }
+
+ //环绕通知
+ public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
+ System.out.println("环绕通知-前");
+ //调用目标方法
+ Object proceed = joinPoint.proceed();
+ System.out.println("环绕通知-后");
+ return proceed;
+ }
+
+ //异常通知
+ public void afterException(JoinPoint joinPoint, Exception exception) {
+ System.err.println("后置异常通知:" + exception);
+ }
+
+ ;
+
+ // 后置通知 总会执行 但是不能访问到返回值
+ public void after(JoinPoint joinPoint) {
+ System.out.println("后置通知");
+ }
+}
diff --git a/spring/spring-aop/src/main/java/com/heibaiying/bean/Order.java b/spring/spring-aop/src/main/java/com/heibaiying/bean/Order.java
new file mode 100644
index 0000000..8b1245c
--- /dev/null
+++ b/spring/spring-aop/src/main/java/com/heibaiying/bean/Order.java
@@ -0,0 +1,24 @@
+package com.heibaiying.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description : 订单实体类
+ */
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Order {
+
+ private long id;
+
+ private String productName;
+
+ private Date orderTime;
+}
diff --git a/spring/spring-aop/src/main/java/com/heibaiying/service/OrderService.java b/spring/spring-aop/src/main/java/com/heibaiying/service/OrderService.java
new file mode 100644
index 0000000..d603702
--- /dev/null
+++ b/spring/spring-aop/src/main/java/com/heibaiying/service/OrderService.java
@@ -0,0 +1,16 @@
+package com.heibaiying.service;
+
+import com.heibaiying.bean.Order;
+
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+public interface OrderService {
+
+ Order queryOrder(Long id);
+
+ Order createOrder(Long id, String productName);
+}
diff --git a/spring/spring-aop/src/main/java/com/heibaiying/service/OrderServiceImpl.java b/spring/spring-aop/src/main/java/com/heibaiying/service/OrderServiceImpl.java
new file mode 100644
index 0000000..b4fc339
--- /dev/null
+++ b/spring/spring-aop/src/main/java/com/heibaiying/service/OrderServiceImpl.java
@@ -0,0 +1,22 @@
+package com.heibaiying.service;
+
+import com.heibaiying.bean.Order;
+
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+public class OrderServiceImpl implements OrderService {
+
+ public Order queryOrder(Long id) {
+ return new Order(id, "product", new Date());
+ }
+
+ public Order createOrder(Long id, String productName) {
+ // 模拟抛出异常
+ // int j = 1 / 0;
+ return new Order(id, "new Product", new Date());
+ }
+}
diff --git a/spring/spring-aop/src/main/resources/aop.xml b/spring/spring-aop/src/main/resources/aop.xml
new file mode 100644
index 0000000..e2b6235
--- /dev/null
+++ b/spring/spring-aop/src/main/resources/aop.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-aop/src/test/java/com/heibaiying/aop/AopTest.java b/spring/spring-aop/src/test/java/com/heibaiying/aop/AopTest.java
new file mode 100644
index 0000000..2b0e852
--- /dev/null
+++ b/spring/spring-aop/src/test/java/com/heibaiying/aop/AopTest.java
@@ -0,0 +1,27 @@
+package com.heibaiying.aop;
+
+import com.heibaiying.service.OrderService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author : heibaiying
+ * @description : 关于多个切面在同一个切入点上执行顺序的例子 可以在spring-aop-annotation 中查看
+ */
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration("classpath:aop.xml")
+public class AopTest {
+
+ @Autowired
+ private OrderService orderService;
+
+ @Test
+ public void save() {
+ orderService.createOrder(1283929319L, "手机");
+ //orderService.queryOrder(4891894129L);
+ }
+}