首先上一张AOP的图示

一:几个重要的概念
  1> 切面:横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象[验证切面。日志切面]
  2> 通知:切面中的每个方法
  3> 目标:被通知的方法(业务逻辑中的方法)
  4> 代理(proxy):向目标对象应用通知之后创建的对象
  5> 连接点:程序运行前的某个特定位置(详细的物理存在):如某个方法调用前,调用后,方法抛出异常后等。

连接点由两个信息确定:方法表示的程序运行点相对点表示的方位。

  6> 切点:每一个类会有多个连接点(看不到摸不到,非详细物理存在)[通过切点能够定位到非常多个连接点]即:连接点是程序类中客观存在的事务。

AOP通过切点定位到特定的链接点。

类比:连接点相当于数据库中的记录,切点相当于查询条件。切点和连接点不是一一相应的关系,一个切点匹配多个连接点。切点通过接口进行描写叙述。使用类和方法作为连接点的查询条件。



二:Spring AOP
  1)增加jar包
  2)在配置文件里增加aop的命名空间(namespace),完整命名空间例如以下:
    <?xml version="1.0" encoding="GB18030"?

>

    <beans xmlns="http://www.springframework.org/schema/beans"

           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

           xmlns:aop="http://www.springframework.org/schema/aop"

           xsi:schemaLocation="http://www.springframework.org/schema/beans                               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd                               http://www.springframework.org/schema/aop                               http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

    </beans>
  3)基于注解的方式
     1.在配置文件里增加该配置
     <!-- 启动用JDK动态代理完毕对Aop的支持,支持注解的形式 -->
     <aop:aspectj-autoproxy></aop:aspectj-autoproxy> 
     
     2.配置切面及业务逻辑对象  
     但在 spring4.0 能够配置自己主动扫描的包。仅仅须要包命明白就可以
     <context:component-scan   base-package="" />
    
     spring2.0不具备该属性。正确配置例如以下:1》切面 2》业务逻辑对象
     <!-- 切面 -->
     <bean id="checkAspect" class="com.inspur.aop.impl.CheckAspect"></bean>
     <!-- 业务逻辑对象 -->
     <bean id="calculator"  class="com.inspur.aop.impl.CalculatorLightImpl"> 
     </bean> 


     3.通过代码进行展示 testspring2
    package com.inspur.aop.impl;
    import java.util.Arrays;
    import java.util.List;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    @Aspect
    public class CheckAspect {
         /**
          * 切入点 做标识使用 特征:private void 方法名(){ }
          */
         @Pointcut("execution(* com.inspur.aop.impl.*.*(..))")
         public void allCalMethod() {}


         @Before("allCalMethod()")
         public void check(JoinPoint joinPoint) {
          //两种方法获取參数的值
          /*// 取得參数的值
             Object[] objects = joinPoint.getArgs();
             if (objects != null && objects.length > 0) {
                 for (Object arg : objects) {
                     System.out.println(arg);
                 }
          }*/
           String methodName = joinPoint.getSignature().getName();
           System.out.println(" methodName " + methodName);
           List<Object> args = Arrays.asList(joinPoint.getArgs());
           System.out.println(" the method " + methodName + " begin with " + args);
        }
    }
    
    另:切入点事实上能够不进行书写,仅作为标识使用。

        如不写,则在通知(@befor,@after等)中写进运行语句
            即@Before("execution(* com.inspur.aop.impl.*.*(..))")
        也能够实现作为切面的功能。
面向切面编程是面向对象编程的一种改进。他的出如今于解决两大问题:(详见testSpring2项目)
  1.代码混乱:越来越多的非业务需求(日志和校验等)增加后,原有的业务方法急剧膨胀, 每一个方法在处理核心业务逻辑时,还必须兼顾其它多个关注点。
  2.代码分散:以日志需求为例。仅仅是为了满足这个单一的需求,就不得不在多个模块 里面多次反复同样的日志代码。

假设日志代码发生改变,也必须改动全部模板。[核心代码须要写入众多的输出语句,代码冗余及维护困难等各种问题]



从上述代码引申三个问题:
1.切入点的定义[execution:运行]
·随意公共方法的运行
  execution(public * *(..))
·随意一个以‘set’開始的方法的运行
  execution(* set*(..))
·AccountService接口的随意方法的运行
execution(* com.xyz.service.AccountService.(..))
·定义在service包里随意方法的运行(最为经常使用)
  execution(* com.xyz.service.*.*(..))
·定义在service包或子包里随意方法的运行
 )
2.Adivce。通知的类型
 ·前置通知 @Before
 ·后置通知 @After
 ·返回后通知
 ·异常抛出后通知
 ·围绕通知
3.JoiPoint方法:不论什么一个增强方法都能够通过将第一个入參声明为 JoinPoint
訪问到连接点上下文的信息。(简化日志)
  AspectJ 使用 org.aspectj.lang.JoinPoint 接口表示目标类连接点对象。假设是围绕增强时,使用org.aspectj.lang.ProceedingJoinPoint
表示连接点对象,该类是 JoinPoint 的子接口。

不论什么一个增强方法都能够通过将第一个入參声明为 JoinPoint 訪问到连接点上下文的信息。我们先来了解一下这两个接口的主要方法: 

1) JoinPoint 

 java.lang.Object[] getArgs():获取连接点方法执行时的入參列表。 

 Signature getSignature() :获取连接点的方法签名对象。 

 java.lang.Object getTarget() :获取连接点所在的目标对象; 

 java.lang.Object getThis() :获代替理对象本身; 

2) ProceedingJoinPoint 

   ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于运行连接点方法的方法: 

 java.lang.Object proceed() throws java.lang.Throwable:通过反射运行目标对象的连接点处的方法; 

 java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射运行目标对象连接点处的方法,只是使用新的入參替换原来的入參。

  上面的代码提到了两种获取參数的方法。重点记住各个方法的类型及遍历的方式。



对AOP切面的一些整理与理解的更多相关文章

  1. Spring AOP切面

    在软件开发中,分布于应用多出的功能被称为和横切关注点. 通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(可是往往直接嵌入到应用的业务逻辑中).将这些横切关注点与业务逻辑相分离正是面向切面编成( ...

  2. 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  3. Spring基础篇——Spring的AOP切面编程

    一  基本理解 AOP,面向切面编程,作为Spring的核心思想之一,度娘上有太多的教程啊.解释啊,但博主还是要自己按照自己的思路和理解再来阐释一下.原因很简单,别人的思想终究是别人的,自己的理解才是 ...

  4. SpringBoot 通过自定义注解实现AOP切面编程实例

    一直心心念的想写一篇关于AOP切面实例的博文,拖更了许久之后,今天终于着手下笔将其完成. 基础概念 1.切面(Aspect) 首先要理解‘切’字,需要把对象想象成一个立方体,传统的面向对象变成思维,类 ...

  5. spring5 源码深度解析----- Spring事务 是怎么通过AOP实现的?(100%理解Spring事务)

    此篇文章需要有SpringAOP基础,知道AOP底层原理可以更好的理解Spring的事务处理. 自定义标签 对于Spring中事务功能的代码分析,我们首先从配置文件开始人手,在配置文件中有这样一个配置 ...

  6. 一文带你搞定AOP切面

    摘要:AOP在spring中又叫"面向切面编程",是对传统我们面向对象编程的一个补充,主要操作对象就是"切面",可以简单的理解它是贯穿于方法之中,在方法执行前. ...

  7. Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现

    前文,我们分析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的.本文主要介绍Spring AOP原理解析的切面实现过程(将切面类的所 ...

  8. Spring AOP切面的时候参数的传递

    Spring AOP切面的时候参数的传递 Xml: <?xml version="1.0" encoding="UTF-8"?> <beans ...

  9. Spring aop切面插入事物回滚

    <!-- tx标签配置 事物--> <tx:advice id="txadvice" transaction-manager="transactionM ...

随机推荐

  1. 使用echarts展示线状图信息的时候数据部分数据因为x轴的数据显示不全而隐藏的问题

    在使用echarts来展示数据时,因为数据很多的原因导致x轴显示不全,然后有些数据也隐藏在图表中,所以这个时候我们要在 series 中设置一个属性,让所有的数据都能够展示出来,这里我们需要添加的属性 ...

  2. Tomcat 部署2个项目,只有一个可以访问的解决方案

    Tomcat 部署2个应用后只有一个可以访问,另一个不能访问,一般来说就是因为Tomcat启动加载了配置文件后,当启动另一个应用时由于一些配置名称相同所以不再加载,导致之后应用无法正常启动. 异常信息 ...

  3. Selenium2+python自动化49-判断文本(text_to_be_present_in_element)【转载】

    前言 在做结果判断的时候,经常想判断某个元素中是否存在指定的文本,如登录后判断页面中是账号是否是该用户的用户名. 在前面的登录案例中,写了一个简单的方法,但不是公用的,在EC模块有个方法是可以专门用来 ...

  4. (十六)MySQL集群galera实现

    (1)环境介绍 galera官网:http://galeracluster.com/downloads/ # cat /etc/redhat-release CentOS Linux release ...

  5. 洛谷——P1754 球迷购票问题

    题目背景 盛况空前的足球赛即将举行.球赛门票售票处排起了球迷购票长龙. 按售票处规定,每位购票者限购一张门票,且每张票售价为50元.在排成长龙的球迷中有N个人手持面值50元的钱币,另有N个人手持面值1 ...

  6. rsync用于同步目录

    rsync是unix/linux下同步文件的一个高效算法,它能同步更新两处计算机的文件与目录,并适当利用查找文件中的不同块以减少数据传输.rsync中一项与其他大部分类似程序或协定中所未见的重要特性是 ...

  7. 带WHERE子句的UPDATE语句

    目前演示的几个UPDATE语句都是一次性更新所有行的数据,这无法满足只更新符合特定条件的行的需求,比如“将Tom 的年龄修改为12 岁”.要实现这样的功能只要使用WHERE 子句就可以了,在WHERE ...

  8. 分享Kali Linux 2017年第29周镜像文件

     分享Kali Linux 2017年第29周镜像文件 Kali Linux官方于7月16日发布2017年的第29周镜像.这次维持了11个镜像文件的规模.默认的Gnome桌面的4个镜像,E17.KDE ...

  9. Jenkins上配置Robot Framework测试邮件通知模板

    邮件效果 测试成功如下所示: jenkins_robot_success 测试失败如下所示: jenkins_robot_failure 通过这个模板,我们能够很直观地看出测试的执行情况,以及相关的统 ...

  10. luogu P4012 深海机器人问题

    luogu P4012 深海机器人问题 // luogu-judger-enable-o2 #include<queue> #include<cstdio> #include& ...