zoukankan      html  css  js  c++  java
  • spring-aop思想实践demo

    需求:

    例如我们需要有一个类中每个方法执行前都需要做一个权限校验,必须是有特定权限的账号才能完成该方法的操作。

    解决方案:

    1.使用父类继承方式,书写该类的父类,然后在父类中定义一个checkPri的权限校验方法,然后子类(就是我的目标需求子类)每个方法调用这个父类方法,完成权限校验。

    弊端:这是纵向完成形式,如果我哪天不需要校验了,首先要取消继承,然后还要每个方法都把父类方法删掉。。。

    2.相对于第一种方式,如果采用aop横向切割的方式做,它相当于一个组件作用在方法中,方法中不需要做任何改变,有种“润物细无声”的感觉,完成扩展功能!

    简易aop测试搭建(xml形式):

     <dependencies>
       <!-- <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>-->
        <!--spring-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>4.3.7.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>4.3.7.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>4.3.7.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-expression</artifactId>
          <version>4.3.7.RELEASE</version>
        </dependency>
        <!--spring aop-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aop</artifactId>
          <version>4.3.7.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjrt</artifactId>
          <version>1.6.11</version>
        </dependency>
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.6.11</version>
        </dependency>
    
        <dependency>
          <groupId>cglib</groupId>
          <artifactId>cglib</artifactId>
          <version>2.2.2</version>
        </dependency>
        <!--test spring 于junit整合-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>4.3.7.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.7</version>
        </dependency>
    
      </dependencies>
    //切入点和通知     权限校验或者日志封装
    public class Aspect {
    
    
        public void checkPri(){
            System.out.println("权限校验!!");
        }
    
        public void logPrint(){
            System.out.println("log 打印!!");
        }
    
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--扫描包-->
    <context:component-scan base-package="aop.*"></context:component-scan>

    <!-- 在配置文件中开启注解的AOP的开发============ -->
    <aop:aspectj-autoproxy/>

    <!-- 配置目标类================ -->
    <!--<bean id="productDao" class="aop.dao.ProductDaoImpl">
    </bean>-->

    <!-- 配置切面类================ -->
    <bean id="myAspect" class="aop.Aspect.Aspect"></bean>

    <!--通过aop配置对目标类增强-->
    <aop:config>
    <!--切入点 配置哪些类那些方法被增强-->
    <aop:pointcut id="p1" expression="execution(* aop.dao.ProductDaoImpl.save(..))"></aop:pointcut>
    <aop:pointcut id="p2" expression="execution(* aop.dao.ProductDaoImpl.delete(..))"></aop:pointcut>
    <aop:pointcut id="p3" expression="execution(* aop.dao.ProductDaoImpl.update(..))"></aop:pointcut>
    <aop:pointcut id="p4" expression="execution(* aop.dao.ProductDaoImpl.query(..))"></aop:pointcut>
    <!--通知 配置通知类-->
    <aop:aspect ref="myAspect" >
    <!--前置通知-->
    <aop:before method="checkPri" pointcut-ref="p1"></aop:before>
    <aop:after-returning method="logPrint" pointcut-ref="p2" returning="result"></aop:after-returning>
    <aop:around method="watch" pointcut-ref="p3"></aop:around>
    <aop:after-throwing method="afterAfterThrowing" pointcut-ref="p4" throwing="ex"></aop:after-throwing>
    <aop:after method="after" pointcut-ref="p2" ></aop:after>
    </aop:aspect>
    </aop:config>
    </beans>
    package aop.Aspect;

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;

    //切入点和通知 权限校验或者日志封装
    public class Aspect {

    //前置
    public void checkPri(JoinPoint joinPoint){
    System.out.println("权限校验!!"+joinPoint);
    //return;//不起作用!
    }

    //后置通知
    public void logPrint(Object result){//参数名称必须与配置文件的returning一致
    System.out.println("log 打印!!");
    //后置通知可以获得方法返回值
    System.out.println("获得结果数值"+result);
    }

    //环绕通知
    public Object watch(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("前置通知。。。。");
    Object proceed = joinPoint.proceed();//这边可以控制目标对象切入点方法是否执行
    System.out.println("后置通知。。。。");
    return proceed;
    }

    //异常抛出通知
    public void afterAfterThrowing(Throwable ex){
    System.out.println("异常通知!");
    ex.printStackTrace();
    }

    //最终通知
    public void after(){
    System.out.println("最终通知!");
    }
    }

     

    这边要获得joinpoint 注意导入jar包要正确,不然会报错!!!

  • 相关阅读:
    Android:实现手势滑动的事件处理方法
    Android开发——跟随手指的小球实现
    android 关于setWidth()和setHeight()没反应的问题
    Android 设置 横屏 竖屏
    Android给TextView设置透明背景、圆角边框
    android 为TextView添加边框
    C++实现RTMP协议发送H.264编码及AAC编码的音视频
    视频编码器
    HTTP Live Streaming直播(iOS直播)技术分析与实现
    nginx上搭建HLS流媒体服务器
  • 原文地址:https://www.cnblogs.com/Danial7777777/p/10703469.html
Copyright © 2011-2022 走看看