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); + } +}