Spring — AOP面向切面编程(一)

一、代理模式概述

  1. 代理的特点:(目标对象即被代理者)

    1. 实现和目标对象相同的接口
    2. 具备和目标对象的方法
    3. 代理者不仅要做目标对象的方法 , 还要做一些额外的操作
  2. 使用场景:
    1. 事务
    2. 权限控制
    3. 统计每个方法的执行时间

二、静态代理


1. 静态代理优点
1. 解耦
2. 静态代理缺点:
1. 一个代理类只能服务于一个被代理 , 如果被代理类很多 , 则操作会非常繁琐
2. 代码复用性不高 , 重复代码太多
3. 代理类的通用性几乎为0
4. 案例: 把service层的事务管理操作解耦

    事务管理类@Componentpublic class TXManage {public void startTx(){System.out.println("开启事务");}public void commti(){System.out.println("提交事务");}public void rollback(){System.out.println("回滚事务");}}静态代理类注意实现与代理目标相同的接口需要指定id , 与注解的机制有关@Component("personService")public class StaticProxy implements PersonService{@Autowiredprivate TXManage tx ;@Autowiredprivate PersonServiceImpl pl;@Overridepublic void savePerson(Person person) {try{tx.startTx();pl.savePerson(person);tx.commti();}catch(Exception e){tx.rollback();}}}

三、动态代理


1. 动态代理分为两种:
1. JDK提供的动态代理
2. CGLib动态代理
2. JDK提供的动态代理
1. 优点:
1. 继承静态代理的优点 , 一个代理类可以为多个目标类服务
2. 提高代码复用性
2. 缺点:
1. 并不是所有的方法都需要代理 , 需要进行方法过滤 , 过程繁琐
3. 必须要求目标类有接口
4. 案例: 把service层的事务管理操作解耦

        事务管理类   @Componentpublic class TXManage {public void startTx(){System.out.println("开启事务");}public void commti(){System.out.println("提交事务");}public void rollback(){System.out.println("回滚事务");}}动态代理生成类@Componentpublic class DynamicProxy {@Autowiredprivate TXManage tx;public  Object getProxy(final Object tagert){Object proxy = Proxy.newProxyInstance(tagert.getClass().getClassLoader(), tagert.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {tx.startTx();Object result = method.invoke(tagert, args);tx.commti();return result;}});return  proxy;}}改造调用service的层 , 使他调用的是代理之后的service@Controllerpublic class PersonServlet {@Autowiredprivate PersonService personService;@Autowiredprivate DynamicProxy dp;public void savePerson(Person  person){PersonService ps = (PersonService) dp.getProxy(personService);ps.savePerson(person);}}
  1. CGLib动态代理

    1. 优点:

      1. 继承JDK动态代理的优点
      2. 并不需要目标对象有接口
    2. 缺点:
      1. 方法过滤繁琐

四、Spring AOP面向切面编程

  1. Spring AOP 继承了以上代理所有的优点 , 并且可以对方法进行精准过滤
  2. Spring AOP 内部实现就是通过两种动态代理来实现的 , 进行了封装
  3. AOP:
    1. 是一种编程思想 , 可以实现把某些具体的功能的代码放在一个切面(类)当中 , 在不改动原来项目结构的同时 , 把切面插入到工程中 。 使用 这种编程思想 , 可以使项目的耦合程度降到最低
  4. Spring AOP 的相关概念:
    1. 切面(Aspect):

      1. 就是一个类 , 如: 事务的切面类 、 权限控制的切面类 、 日志输出切面类 。。。
    2. 连接点(Joinpoint):
      1. 代表目标类中的方法
    3. 通知(Advice):
      1. 切面中的方法 , 分为五种通知:

        1. 前置通知: 目标方法执行之前的通知
        2. 后置通知: 目标方法执行之后的通知
        3. 最终通知: 目标方法抛出异常之后的通知(相当于 finally块)
        4. 环绕通知: 目标方法执行前后执行的通知
        5. 异常通知: 目标方法发生异常执行的通知(相当于catch块)
    4. 切入点(Pointcut): 过滤方法的规则 , 只有满足切入点的规则才会执行切面中的通知
    5. 引入:
    6. 目标对象:
      1. 真正执行目标方法的类
    7. AOP代理对象:
      1. 在否和切入点的规则的吧前提下 , 真正执行的对象都是代理对象
    8. 织入:
      1. 代理对象的方法体 , 用来连接通知和目标对象
  5. AOP实现

    1. 实现步骤:

      1. 导入相关jar包
      2. 编写配置文件的头(导入Spring aop约束)
      3. 编写目标类
      4. 编写切面和通知
      5. 配置切入点表达式
      6. 配置切面和通知
    2. 导入相关jar包
      1. spring-aop.jar
      2. spring-aspects.jar
      3. aopectjrt.jar
      4. aspectjweaver.jar
      5. aopalliance.jar
    3. 编写配置文件的头

      <?xml version="1.0" encoding="UTF-8"?>
      <beansxmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:util="http://www.springframework.org/schema/util"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
      </beans>
      
    4. 编写目标类

      @Service
      public class PersonServiceImpl implements PersonService{@Autowiredprivate PersonDao dao;@Overridepublic void savePerson(Person person) {dao.savePerson(person);}}
      
    5. 编写切面和通知

      @Component
      public class TxAspect {@Autowiredprivate TXManage tx;public Object around(ProceedingJoinPoint  pjp) throws Throwable{tx.startTx();pjp.proceed();tx.commti();return null;}
      }
      
    6. 配置切面表达式

      <!-- 配置切面 -->
      <aop:config><!-- 配置切入点   一定要在切面的上面配置--><!-- within表达式只能过滤包和类 --><aop:pointcut expression="within(com.tj.service.*)" id="pc"/>
      </aop:config>
      
    7. 配置切面和通知

      <!-- 配置切面 -->
      <aop:config><!-- 配置切入点   一定要在切面的上面配置--><!-- within表达式只能过滤包和类 --><aop:pointcut expression="within(com.tj.service.*)" id="pc"/><!-- 配置切面 --><aop:aspect ref="txAspect" ><!-- 配置切面中的通知 --><aop:around method="around" pointcut-ref="pc"/></aop:aspect>
      </aop:config>
      

大数据WEB阶段Spring框架 AOP面向切面编程(一)相关推荐

  1. 大数据WEB阶段Spring框架 AOP面向切面编程(二)

    Spring AOP面向切面编程(二) 一.切入点的execution表达式 execution的表达形式: execution(修饰符? 返回值类型 所在包类? 方法名(参数列表) 异常?) ?表示 ...

  2. 大数据WEB阶段Spring框架(一)IOC控制反转、DI注入依赖

    Spring-IOC.DI 零.Spring简介 Spring官网:http://projects.spring.io/spring-framework Jar包的下载地址:http://repo.s ...

  3. Spring框架 AOP面向切面编程(转)

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  4. 大数据WEB阶段Spring框架(三)声明式事务处理

    Spring整合JDBC-声明式的事务处理 一.Spring整合JDBC步骤 导入jar包 编写数据库配置文件 也可以将数据库配置信息单独配置后引入Spring容器中 代码中使用 二.Spring框架 ...

  5. 大数据WEB阶段Spring框架(四)Spring-MVC

    Spring-MVC 零.目录 Spring-MVC介绍 Spring-MVC入门案例 使用注解形式简化Cotroller 配置资源解析器 三种方式获取页面传递过来得参数 获取参数时的乱码问题 日期获 ...

  6. 大数据WEB阶段Spring框架(二)简化配置的操作

    Spring简化配置的操作 零.复习 IOC控制反转, 之前是通过new创建对象 , IOC是由Spring容器创建对象 , 需要用时getBean获取 . 导入约束文件 获取对象两种方式 : 通过I ...

  7. spring中AOP(面向切面编程)

    spring中AOP(面向切面编程) 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是spring框架中的一个重要内容 ...

  8. 【SSM】Spring系列——AOP面向切面编程

    文章目录 03 AOP面向切面编程 3.1 AOP概述 3.2 面向切面编程对有什么好处 3.3 模拟AOP框架实现 3.3.1 代码实现版本一 3.3.2 代码实现版本二 3.3.3 代码实现版本三 ...

  9. Spring Boot AOP面向切面编程使用(定义切入点、前置通知、后置通知、返回通知、异常通知、环绕通知)

    1 AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发 ...

最新文章

  1. javascript迭代器_JavaScript迭代器概述
  2. 2018 中国开源年度报告发布,阿里系独占鳌头
  3. 当当架构部张亮:从码农到大牛,技术与心境的双重提升
  4. css = display: none, visibility: hidden, opacity: 0 的区别
  5. Linux 7 cmake:curses library not found
  6. 小白兔生小白兔-菲波拉契数列问题
  7. file数组 删除文件_java编程IO基础之一:File类
  8. 信息学奥赛一本通 1958:【12NOIP普及组】寻宝 | OpenJudge NOI 1.12 06 | 洛谷 P1076 [NOIP2012 普及组] 寻宝
  9. 云图说|初识云数据库GaussDB(for Redis)
  10. java跨系统和跨域_java web服务解决跨域问题
  11. 上楼梯算法的java实现(转)
  12. ​小米 11 发布,售价 3999 元起;罗永浩回应败诉半导体公司;deepin 20.1(1010) 发布|极客头条...
  13. UVA722 LA5359 Lakes【DFS】
  14. Codeforces Round #468 (Div. 2): D. Peculiar apple-tree(水题)
  15. 如何最大程度地提高cin和cout的效率
  16. 动态交叉表(永洪bi)
  17. 24种不同的ITF条形码字体版本的条形码控件Interleaved 2 of 5 Barcode Font Advantage Package...
  18. 微软时间服务器同步错误,Windows Server 设置时间同步出错问题
  19. 前端加密 后端Java解密
  20. 【图像超分辨率重建】——GRL论文精读笔记

热门文章

  1. [转]tesseract OCR Engine overview字符识别学习
  2. linux ps aux 结果解释
  3. Windows 8 开发31日-第04日-新控件
  4. STL源码学习----集合相关算法
  5. Castle实践9-在Castle IOC容器中使用AspectSharp(全面剖析AspectSharp Facility)
  6. 利用java格里高利公式求圆周率_用格里高利公式求π的近似值
  7. Java黑皮书课后题第4章:*4.9(给出字符的Unicode码)编写程序,得到一个字符的输入,然后显示其Unicode值
  8. C语言学习之求一个3×3的整型矩阵对角线元素之和
  9. php判断三角形类型,C#_C#判断三角形的类型,题目描述: 输入三角形的三 - phpStudy...
  10. 面向对象——案例练习(3)判断两个立方体是否相等