zoukankan      html  css  js  c++  java
  • springboot-3-aop

    aop存在的目的是进一步解耦, spring支持aspectJ的注解式切面编程

    1), 使用@Aspect声明为一个切面, 并使用@Component加入context中

    2), 使用@After, @Before, @Aroud定义advice, 可直接引入 pointcut

    代码实现: 

    1, 引入aspectJ的依赖

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
     </dependency>       
     <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.8.6</version>
    </dependency>

    2, 自定义注解

    package com.wenbronk.aop;
    
    import org.springframework.stereotype.Component;
    
    /**
     * Created by wenbronk on 2017/5/13.
     */
    @Component
    public class InterceptAnnotation {
    
        @AopAnnotation(value = "注解拦截")
        public void intercept() {
            System.out.println("annotation intercepting");
        }
    
    }

    3, 自定义方法拦截

    package com.wenbronk.aop;
    
    import org.springframework.stereotype.Component;
    
    /**
     * 方法拦截
     * Created by wenbronk on 2017/5/13.
     */
    @Component
    public class IntercepterMethod {
        public void intercepter() {
            System.out.println("method intercepter");
        }
    }

    4, 编写切点

    package com.wenbronk.aop;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.springframework.stereotype.Component;
    
    import java.lang.reflect.Method;
    
    /**
     * 切面
     * Created by wenbronk on 2017/5/13.
     */
    @Aspect
    @Component
    public class AopAspect {
    
        @Pointcut(value = "@annotation(com.wenbronk.aop.AopAnnotation)")   // 切点为注解
        public void pointCut() {};
    
        /**
         * 注解式拦截, 可在@After, @Before, @Aroud中直接引入 @pointCut
         * @param joinPoint
         */
        @After(value = "pointCut()")
        public void afterPointCut(JoinPoint joinPoint) {
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();
            AopAnnotation annotation = method.getAnnotation(AopAnnotation.class);
            System.out.println("注解式拦截: " + annotation.value());
        }
    
    
        /**
         * 方法式拦截
         * @param joinPoint
         */
        @Before(value = "execution(* com.wenbronk.aop.IntercepterMethod.*(..))")
        public void beforePointCut(JoinPoint joinPoint) {
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();
            System.out.println("方法式拦截: " + method.getName());
        }
    
    }

    5, javaconfig

    如果你使用的是springboot方式, 那么需要在启动类上添加  @EnableAspectJAutoProxy 开启AspectJ的支持

    package com.wenbronk.aop;
    
    import org.springframework.boot.SpringBootConfiguration;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    
    /**
     * 配置类, 省却Application.java
     * Created by wenbronk on 2017/5/13.
     */
    @SpringBootConfiguration
    @ComponentScan(basePackages = {"com.wenbronk.aop"})
    @EnableAspectJAutoProxy         // 开启对AspectJ的支持
    public class AopConfig {
    
    
    }

    6,  测试

    package com.wenbronk.aop;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    /**
     * 测试类
     * Created by wenbronk on 2017/5/13.
     */
    public class TestAop {
    
        public static void main(String[] args) {
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class);
    
            // 注解式拦截
            InterceptAnnotation annotation = context.getBean(InterceptAnnotation.class);
            annotation.intercept();
    
            // 方法拦截
            IntercepterMethod method = context.getBean(IntercepterMethod.class);
            method.intercepter();
    
            context.close();
    
        }
    
    }

     http://www.cnblogs.com/wenbronk/

  • 相关阅读:
    Message "'OFFSET' 附近有语法错误。 在 FETCH 语句中选项 NEXT 的用法无效。" 解决办法 EntityFrameworkCore
    关于.Net Core 部署在Linux下连接SqlServer数据库超时解决办法
    EntityFrameworkCore Db First 生成Model时出错 PowerShell 版本过低
    八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)
    Loadrunner12 使用谷歌浏览器录制脚本时打不开网页-解决办法
    Loadrunner12 在谷歌浏览器录制https协议的脚本时,提示不是私密链接-解决办法
    loadrunner回放https请求时报connect 时发生ssl协议错误--解决办法
    百度2020春招 笔试算法题第一题 需要买多少瓶果汁
    美团2020春招 笔试算法题 双行道
    美团2020春招 笔试算法题 最好一样
  • 原文地址:https://www.cnblogs.com/wenbronk/p/6848984.html
Copyright © 2011-2022 走看看