需求:

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

解决方案:

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

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

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

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

  1. <dependencies>
  2. <!-- <dependency>
  3. <groupId>junit</groupId>
  4. <artifactId>junit</artifactId>
  5. <version>4.11</version>
  6. <scope>test</scope>
  7. </dependency>-->
  8. <!--spring-->
  9. <dependency>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-context</artifactId>
  12. <version>4.3.7.RELEASE</version>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-beans</artifactId>
  17. <version>4.3.7.RELEASE</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-core</artifactId>
  22. <version>4.3.7.RELEASE</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework</groupId>
  26. <artifactId>spring-expression</artifactId>
  27. <version>4.3.7.RELEASE</version>
  28. </dependency>
  29. <!--spring aop-->
  30. <dependency>
  31. <groupId>org.springframework</groupId>
  32. <artifactId>spring-aop</artifactId>
  33. <version>4.3.7.RELEASE</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.aspectj</groupId>
  37. <artifactId>aspectjrt</artifactId>
  38. <version>1.6.11</version>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.aspectj</groupId>
  42. <artifactId>aspectjweaver</artifactId>
  43. <version>1.6.11</version>
  44. </dependency>
  45.  
  46. <dependency>
  47. <groupId>cglib</groupId>
  48. <artifactId>cglib</artifactId>
  49. <version>2.2.2</version>
  50. </dependency>
  51. <!--test spring 于junit整合-->
  52. <dependency>
  53. <groupId>org.springframework</groupId>
  54. <artifactId>spring-test</artifactId>
  55. <version>4.3.7.RELEASE</version>
  56. </dependency>
  57. <dependency>
  58. <groupId>junit</groupId>
  59. <artifactId>junit</artifactId>
  60. <version>4.7</version>
  61. </dependency>
  62.  
  63. </dependencies>
  1. //切入点和通知 权限校验或者日志封装
  2. public class Aspect {
  3.  
  4. public void checkPri(){
  5. System.out.println("权限校验!!");
  6. }
  7.  
  8. public void logPrint(){
  9. System.out.println("log 打印!!");
  10. }
  11.  
  12. }
  1. <?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">
  2.  
  3. <!--扫描包-->
    <context:component-scan base-package="aop.*"></context:component-scan>
  4.  
  5. <!-- 在配置文件中开启注解的AOP的开发============ -->
    <aop:aspectj-autoproxy/>
  6.  
  7. <!-- 配置目标类================ -->
    <!--<bean id="productDao" class="aop.dao.ProductDaoImpl">
    </bean>-->
  8.  
  9. <!-- 配置切面类================ -->
    <bean id="myAspect" class="aop.Aspect.Aspect"></bean>
  10.  
  11. <!--通过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>
  1. package aop.Aspect;
  2.  
  3. import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
  4.  
  5. //切入点和通知 权限校验或者日志封装
    public class Aspect {
  6.  
  7. //前置
    public void checkPri(JoinPoint joinPoint){
    System.out.println("权限校验!!"+joinPoint);
    //return;//不起作用!
    }
  8.  
  9. //后置通知
    public void logPrint(Object result){//参数名称必须与配置文件的returning一致
    System.out.println("log 打印!!");
    //后置通知可以获得方法返回值
    System.out.println("获得结果数值"+result);
    }
  10.  
  11. //环绕通知
    public Object watch(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("前置通知。。。。");
    Object proceed = joinPoint.proceed();//这边可以控制目标对象切入点方法是否执行
    System.out.println("后置通知。。。。");
    return proceed;
    }
  12.  
  13. //异常抛出通知
    public void afterAfterThrowing(Throwable ex){
    System.out.println("异常通知!");
    ex.printStackTrace();
    }
  14.  
  15. //最终通知
    public void after(){
    System.out.println("最终通知!");
    }
    }

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

spring-aop思想实践demo的更多相关文章

  1. Spring AOP应用实例demo

    AOP(Aspect-Oriented Programming.面向方面编程).能够说是OOP(Object-OrientedPrograming.面向对象编程)的补充和完好.OOP引入封装.继承和多 ...

  2. 深入理解Spring AOP思想

    什么是AOP?AOP解决了什么问题? 在传统的开发模式中,以下层次的是非常常见的一种,业务层每一个方法都要有重复的事务代码 如何改善这个问题? AOP希望将A.B 这些分散在各个业务逻辑中的相同代码, ...

  3. 【AOP】Spring AOP基础 + 实践 完整记录

    Spring AOP的基础概念 ============================================================= AOP(Aspect-Oriented Pr ...

  4. SSH框架系列:Spring AOP应用记录日志Demo

    分类: [java]2013-12-10 18:53 724人阅读 评论(0) 收藏 举报 1.简介 Spring 中的AOP为Aspect Oriented Programming的缩写,面向切面编 ...

  5. Spring aop 小例子demo

    由于最近的服务项目提供接口有一个需求,所有操作都必须检查操作的服务可用,所以感觉Aop特别适合实施.完成学习的小例子. 关于spring-Aop原理:http://m.oschina.net/blog ...

  6. spring Aop的一个demo

    面向切面是什么我就不说了. 上代码: package com.foreveross.service.weixin.test; import java.lang.annotation.Documente ...

  7. spring aop 的一个demo(未完,待完善)

    假设我们有这样的一个场景 : 对于一个类的众多方法,有些方法需要从缓存读取数据,有些则需要直接从数据库读取数据.怎样实现呢? 实现方案有多种.下面我说下常见的几种实现方案 : 1.直接采用spring ...

  8. Spring AOP注解配置demo

    https://blog.csdn.net/yhl_jxy/article/details/78815636#commentBox

  9. spring aop思想

随机推荐

  1. 比较爬虫用的语言Python与Go

    Python是我比较喜欢的语言,莫名的喜欢,对Python的学习可能起初是敲错了网址开始的,哈哈哈~ 工作的任务从一个网站后台做登录.爬取数据,写入服务器Redis中,同事认为我会用PHP来写,哼!让 ...

  2. spring boot hello world

    本文讲解初始用户搭建spring boot 工程. 新建工程目录结构: application.java放在最外层的包目录里 先添加pom.xml的依赖包: <project xmlns=&qu ...

  3. JDBC-day1

    package cn.gzsxt.test; import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.D ...

  4. Linux监控

    第三十次课 Linux监控 目录 一. Linux监控平台介绍 二. zabbix监控介绍 三. 安装zabbix 四. 忘记Admin密码如何做 五. 主动模式和被动模式 六. 添加监控主机 七. ...

  5. 20175224 2018-2019-2 《Java程序设计》第四周学习总结

    教材学习内容总结 子类的定义 class 子类名 extends 父类名 { ... } 子类继承性 子类继承父类的成员变量.方法.成员变量可以被子类中自己定义的任何实例方法操作:继承的方法可以被子类 ...

  6. win 10 安装 maven安装包

    学习jenkins 的时候,需要用到maven,第一次搞maven,记录下 一.准备工作,下载 jdk7.0以上版本 win10操作系统 maven安装包  下载地址  如下图 二.解压安装包 我的安 ...

  7. 2017-10-6模拟赛T1 手工(handicraft.*)

    题目 题解 题意很明显,就不讲了. 我们发现从一个A边形切出一个B边形有几种情况: 1. 得到一个(A-B+2)边形和一个B边形(直线过两顶点): 2. 得到一个(A-B+3)边形和一个B边形(直线过 ...

  8. mssql server 数据库帮助类

    using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Web ...

  9. python调用c++ DLL

    python DLL = ctypes.cdll.LoadLibrary("./dll_file.so") #引入dllDLL.func(mat.ctypes.data // (1 ...

  10. flock

    为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成串行状态.作为锁机制中的一种,PHP的文件锁也是为了应对资源竞争.假设一个应用场景,在存在较大并发的情况下,通过fwrite向文件尾部多次有 ...