springboot切面编程,自定义注解
目标:创建自定义注解,实现切面编程
首先在pom文件加入:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> </dependency>
创建Annontation:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface AoundAnnotation { }
创建Annontation的处理类aspect
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Aspect @Component public class AoundAnnotationAspect { /** * 此处的切点是注解的方式,也可以用包名的方式达到相同的效果 * '@Pointcut("execution(* yxm.zyf.love.service.impl.*.*(..))")' */ @Pointcut("@annotation(yxm.zyf.love.annontation.AoundAnnotation)") public void operationLog(){} /** * 环绕通知 * */ @Around("operationLog()") public boolean doAround(ProceedingJoinPoint joinPoint) throws Throwable{ boolean b=false; System.out.println("进入切面"); return (boolean)joinPoint.proceed(); //return b; } /** * 进入业务方法前 * */ @Before("operationLog()") public void doBeforeAdvice(JoinPoint joinPoint){ System.out.println("进入方法前执行....."); } /** * 处理完请求,返回内容 * @param ret */ @AfterReturning(returning = "ret", pointcut = "operationLog()") public void doAfterReturning(Object ret) { System.out.println("方法的返回值 : " + ret); } /** * 后置异常通知 */ @AfterThrowing("operationLog()") public void throwss(JoinPoint jp){ System.out.println("方法异常时执行....."); } /** * 后置最终通知,final增强,不管是抛出异常或者正常退出都会执行 */ @After("operationLog()") public void after(JoinPoint jp){ System.out.println("方法最后执行....."); } }
测试:
@RunWith(SpringRunner.class) @SpringBootTest(classes = DemoApplication.class) public class TestAnnotation { @Autowired private AnnontationServiceTestImpl a; @Test public void testA() throws Exception{ System.out.println("单元测试开始"); a.anoundTest(); System.out.println("单元测试完成"); } }