zoukankan      html  css  js  c++  java
  • 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("单元测试完成");
        }
    }

  • 相关阅读:
    系统调用(转)
    linux 特殊符号(转)
    对物权法第十二章建设用地使用权解读(转载)
    地籍管理信息化总体设计纲要
    行业管理架构初探
    基础框架平台——基础管理框架——GUI实现设计(一)
    通过类库来实现多窗体windows程序遇到了些问题,请大家有空帮忙看一下,谢谢
    基础框架平台——基础管理框架——GUI抽象设计(布局管理器)
    基础框架平台——基础管理框架——GUI抽象设计(工作台)
    当窗体最大化后,系统提示"集合在窗体变化时发生了修改",请问是什么缘故啊?
  • 原文地址:https://www.cnblogs.com/zyf-yxm/p/10833170.html
Copyright © 2011-2022 走看看