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/

  • 相关阅读:
    列表第一篇文档与其他文档不同样式
    当前栏目判断有无子栏目
    当前栏目文章数
    有关当前焦点的标签,只有我能理解
    给推荐一个标识
    附件下载次数
    收藏代码
    关联会员头像信息
    当前三级折叠菜单导航
    centos7 安装配置apache
  • 原文地址:https://www.cnblogs.com/wenbronk/p/6848984.html
Copyright © 2011-2022 走看看