一、AOP简介

   AOP是Aspect-Oriented Programming的缩写,即面向切面编程。利用oop思想,可以很好的处理业务流程,但是不能把系统中某些特定的重复性行为封装到模块中。例如,在很多业务中都需要记录操作日志,结果我们不得不在业务流程中嵌入大量的日志记录代码。无论是对业务代码还是对日志记录代码来说,维护都是相当复杂的。由于系统中嵌入了这种大量的与业务无关的其他重复性代码,系统的复杂性、代码的重复性增加了。维护起来会更加复杂。

   AOP可以很好解决这个问题,AOP关注的是系统的“截面”,在适当的时候“拦截”程序的执行流程,把程序的预处理和后期处理交给某个拦截器来完成。比如,访问数据库时需要记录日志,如果使用AOP的编程思想,那么在处理业务流程时不必在去考虑记录日志,而是把它交给一个专门的例子记录模块去完成。这样,程序员就可以集中精力去处理业务流程,而不是在实现业务代码时嵌入日志记录代码,实现业务代码与非业务代码的分别维护。在AOP术语中,这称为关注点分离。AOP的常见应用有日志拦截、授权认证、数据库的事务拦截和数据审计等。

二、AOP优点

  当一个方法,对不同的用户的功能要求不满足时,那么需要在此方法的地方就可以出现变化;在这个变化点进行封转,留下一个可扩展的接口,便于后期的维护;

三、AOP专业名词

(1)通知(增强)Advice

  通知定义了切面是什么以及何时使用,应该应用在某个方法被调用之前?之后?还是抛出异常时?等等。

(2)连接点 Join point

  连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时,抛出异常时,甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程中,并添加新的行为。

(3)切点 Pointcut

  切点有助于缩小切面所通知的连接点的范围。如果说通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”,切点会匹配通知所要织入的一个或多个连接点,一般常用正则表达式定义所匹配的类和方法名称来指定这些切点。

(4)切面 Aspect

  切面是通知和切点的结合。通知和切点定义了切面的全部内容——它是什么,在何时何处完成其功能。

(5)引入 Introduction

  引入允许我们向现有的类添加新方法或属性,从而无需修改这些现有类的情况下,让他们具有新的行为和状态。

(6)织入 Weaving

  在过去我常常把织入与引入的概念混淆,我是这样来辨别的,“引入”我把它看做是一个定义,也就是一个名词,而“织入”我把它看做是一个动作,一个动词,也就是切面在指定的连接点被织入到目标对象中。

四、注解方式实现AOP

  1、C包下在resources文件夹中创建application2.xml文件,具体内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xmlns:jee="http://www.springframework.org/schema/jee"
  8.  
  9. xsi:schemaLocation="
  10. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  11. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  12. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
  13. http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
  14. ">
  15. <context:component-scan base-package="com.zxc.C">
  16. <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/>
  17. </context:component-scan>
  18. <aop:aspectj-autoproxy/>
  19. </beans>
  1. <context:component-scan base-package="com.zxc.C">用来自动扫描com.zxc.C包中带有@component注解的bean类,然后将其加载到内存中。
  1. <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/> 这是aspect切面包的位置。
  1. <aop:aspectj-autoproxy/>用来启用Spring对@Aspect切面配置的支持。

  2、在java类下创建Chinese类,如下:

  这个就是测试用的业务代码,@Componet代表这是个javabean,有xml配置后,自动扫描装载。

  1. package com.zxc.C;
  2. import org.springframework.stereotype.Component;
  3. @Component
  4. public class Chinese{
  5. public String say(String name){
  6. //int a=1/0;用来测试异常增强的
  7. System.out.println("主方法");
  8. System.out.println(name);
  9. return "返回值";
  10. }
  11. }

  3、在java类下创建Test类,用来测试代码:

  1. package com.zxc.C;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class Test {
  5. public static void main(String[] args) {
  6. ApplicationContext ctx=new ClassPathXmlApplicationContext("application2.xml");
  7. Chinese chinese=(Chinese)ctx.getBean("chinese");
  8. chinese.say("环绕增强测试");
  9. }
  10. }

Application用来生成IoC容器,装载application2.xml配置文件,之后通过getBean方法来反射创建一个chinese的对象,在调用其核心业务方法say,say的内容是随意写的。

  4、在java类下创建切面类MyAspect类

  

  1. package com.zxc.C;
  2.  
  3. import org.aspectj.lang.ProceedingJoinPoint;
  4. import org.aspectj.lang.annotation.*;
  5. @Aspect
  6. public class MyAspect {
  7. @Before("execution(* com.zxc.C.*.say*(..))")
  8. public void ok(){
  9. System.out.println("前置增强");
  10. }
  11.  
  12. @After("execution(* com.zxc.C.*.say*(..))")
  13. public void ok1(){
  14. System.out.println("后置增强");
  15. }
  16.  
  17. @AfterReturning(pointcut = "execution(* com.zxc.C.*.say*(..))",returning ="myreturn" )
  18. public void ok2(Object myreturn){
  19. System.out.println(myreturn+"返回增强");
  20. }
  21.  
  22. // @AfterThrowing(pointcut ="execution(* com.zxc.C.*.say*(..))",throwing = "myerror")
  23. // public void ok3(Throwable myerror){
  24. // System.out.println(myerror+"返回增强");
  25. // }
  26.  
  27. @Around("execution(* com.zxc.C.*.say*(..))")
  28. public void ok4(ProceedingJoinPoint pjp){
  29. try {
  30. System.out.println("环绕点前");
  31. Object[] objects=pjp.getArgs();
  32. objects[0]=objects[0]+"环绕增强方法";
  33. System.out.println(pjp.proceed(objects));
  34. System.out.println("环绕点后");
  35. } catch (Throwable throwable) {
  36. throwable.printStackTrace();
  37. }
  38. }
  39.  
  40. }  

  a、增强类型有:前置增强Before、后置增强After、环绕增强Around、异常后增强AfterThrowing、返回增强AfterReturning:用在关注点方法前

    优先级:(可以加上@order(num)来标注优先级,数越小优先级越高,1最小)环绕前增强>前置增强>异常增强>返回增强>环绕后增强>后置增强

  b、其中环绕增强需要在方法形参上加上形参:ProceedingJoinPoint pjp表示可在切面分钟执行的连接点,在关注点方法中,加入pjp.proceed()方法,可以运行业务方法。

    而在异常增强中需要加上形参Throwable error,用来将业务代码中的错误传到关注点方法中。

  c、切点的书写规则:(在异常后增强和返回增强中都要加上pointcut)

AspectJ切点指示器

  d、在切面类上要记得加注解@Abstrct,表示这是个切面。

   e、jointpoint中的几个常用方法

Spring的AOP特性的更多相关文章

  1. Sping框架的IOC特性 悲观锁、乐观锁 Spring的AOP特性

    Sping框架的IOC特性 IOC(Inversion of Control):控制反转 以下以课程与老师的安排来介绍控制反转. 一个合理的课程编排系统应该围绕培训的内容为核心,而不应该以具体的培训老 ...

  2. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  3. spring(二) AOP之AspectJ框架的使用

    前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...

  4. Spring:AOP面向切面编程

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...

  5. 架构探险笔记4-使框架具备AOP特性(上)

    对方法进行性能监控,在方法调用时统计出方法执行时间. 原始做法:在内个方法的开头获取系统时间,然后在方法的结尾获取时间,最后把前后台两次分别获取的系统时间做一个减法,即可获取方法执行所消耗的总时间. ...

  6. Spring中AOP相关源码解析

    前言 在Spring中AOP是我们使用的非常频繁的一个特性.通过AOP我们可以补足一些面向对象编程中不足或难以实现的部分. AOP 前置理论 首先在学习源码之前我们需要了解关于AOP的相关概念如切点切 ...

  7. 【Spring】AOP注解方式实现机制

    一.概述 二.@EnableAspectJAutoProxy 注解分析 三.分析AnnotationAwareAspectJAutoProxyCreator 四.执行流程 1. registerBea ...

  8. Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理

    Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理   本文链接:https://blog.csdn.net/puhaiyang/article/details/78146620 ...

  9. Spring的AOP原理

    转自 https://www.tianmaying.com/tutorial/spring-aop AOP是什么? 软件工程有一个基本原则叫做“关注点分离”(Concern Separation),通 ...

随机推荐

  1. Python中*args和**kwargs的使用

    函数定义 使用*args和**kwargs传递可变长参数: *args用作传递非命名键值可变长参数列表(比如元组) **kwargs用作传递键值可变长参数列表(比如字典) 函数入参 *args 传递一 ...

  2. Selenium基于Python web自动化测试框架 -- PO

    关于selenium测试框架首先想到的就是PO模型,简单说下PO模型 PO模型的概念和理解: PO就是一个设计思想,将代码以页面为单位进行组织,针对这个页面上的所有信息.相关操作都放到一个类中,从而使 ...

  3. acedssget

    大多数ObjectARX函数在处理选择集和实体时,都用名字来识别选择集或实体,该名字用一个长整型对来表示的,并对AutoCAD来维护.在ObjectARX中,该名字的类型为ads_name.在对选择集 ...

  4. MxCAD5.2 20180726更新

    下载地址: http://www.mxdraw.com/ndetail_105.html 1. 增加属性匹配功能 2. 增加List命令 3. 增加CAD图纸审图批注功能 4. 环形阵列功能

  5. 09Java Server Pages 错误处理

    Java Server Pages 错误处理 通常JSP在执行的时候,在两个阶段会发生错误.第一个是JSP网页转译成Servlet类的时候,另一个就是Servlet类处理每一个请求的时候.在第一个阶段 ...

  6. nginx+keepalived+tomcat+memcache实现双VIP高可用及Session会话保持

    Nginx+Keepalived+Tomcat+Memcached 实现双VIP负载均衡及Session会话保持 IP 信息列表: 名称         IP                      ...

  7. Calendar的用法

    DAY_OF_MONTH的主要作用是cal.get(DAY_OF_MONTH),用来获得这一天在是这个月的第多少天 Calendar.DAY_OF_YEAR的主要作用是cal.get(DAY_OF_Y ...

  8. 在PL/SQL DEV里面有把锁一样的按钮,点击它会跳出“these query result are not updateable,include the ROWID to get updateab

    在PL/SQL DEV里面有把锁一样的按钮,点击它会跳出“these query result are not updateable,include the ROWID to get updateab ...

  9. 洛谷——P2236 [HNOI2002]彩票

    P2236 [HNOI2002]彩票 给你$m$个数,从中挑$n$个数,使得这$n$个数的倒数之和恰好等于$\frac{x}{y}$ 常见的剪纸思路: 如果当前的倒数和加上最小可能的倒数和$>$ ...

  10. 洛谷——P1775 古代人的难题_NOI导刊2010提高(02)&& P1936 水晶灯火灵(斐波那契数列)

    P1775 古代人的难题_NOI导刊2010提高(02) P1936 水晶灯火灵 斐波那契数列 1.x,y∈[1…k],且x,y,k∈Z 2.(x^2-xy-y^2)^2=1 给你一个整数k,求一组满 ...