委托代理的概念:

委托类对象就是我们后面说到的"目标对象", 也就是需要【被】代理的对象 target
代理类对象就是我们后面说到的"代理对象",目标对象就是需要这个对象为其做为代理 proxy

  按照代理类的创建时期,代理类可分为两种。
        静态代理类:
            在程序运行前,代理类的.class文件就已经存在了
        动态代理类:

    JDK动态代理要求目标类实现接口,才能对其进行代理
       对于没有实现接口的类,可以使用CGLib进行动态代理
            在程序运行时,代理类是运用了反射技术或字节码技术动态创建而成的

AOP的概念:

AOP          面向切面编程

aspect        切面/切面类(要切入的内容)

joinPoint    连接点
            在spring的aop中只有 类中的方法 可以做连接点,每一个方法都可以是一个连接点.
        
    pointCut    切入点
            一组连接点的集合

advice        通知/拦截器 (控制织入地点)
            用来控制切面类将来到底是织入到切入点的前面、后面或者是抛异常的时候。

adivsor        增强器
            用来筛选类中的哪些方法是我们的连接点(哪些方法需要被拦截).

target        目标对象

proxy        代理对象

wave        织入

advice(通知)的类型:

前置通知(Before advice):
            在某些连接点(方法,是接口中的方法)(join point)之前执行的通知

返回后通知(After returning advice):
            在某些连接点(join point)正常完成后执行的通知(方法正常结束,没有异常)

抛出异常后通知(After throwing advice):
            在某些连接点(join point)抛出异常退出时执行的通知

后通知(After (finally) advice):
            当某些连接点(join point)退出的时候执行的通知

环绕通知(Around Advice):
            包围一个连接点(join point)的通知,例如事务的处理,就需要这样的通知,因为事务需要在方法前开启,在方法后提交,以及方法抛出异常时候回滚

注:在spring中,连接点(join point)指的就是方法

1,aop:config标签(':' 前面的是命名空间,区分标签的,避免命名冲突)

使用aop的专用标签来完成相关的配置.
其中主要表现是使用expression的操作:

expression = "execution(public * com.briup.aop.service.*.*(..))"

引号里面就是用表达式的方式来定义切入点,只要是符合这个表达式要求的,该方法就是连接点,连接点的集合就是我们要定义的切入点

从左至右:第一个*:方法的返回类型不限

     第二个*:表示包中任意一个类

    第三个*:类中任意一个返回类型的方法

    (..) 匹配了一个接受任意数量参数的方法

    (*,String) 匹配了一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是String类型

    () 匹配了一个不接受任何参数的方法

2,使用注解配置AOP,就可以去掉xml中的aop标签配置

 @Component
    @Aspect
    public class AnnotationHandler {
        /*
         * 在一个方法上面加上注解来定义切入点
         * 这个切入点的名字就是这个方法的名字
         * 这个方法本身不需要有什么作用
         * 这个方法的意义就是:给这个 @Pointcut注解一个可以书写的地方
         * 因为注解只能写在方法、属性、类的上面,并且方法名作为切入点的名字
         * */
        @Pointcut("execution(public * com.briup.aop.service..*.*(..))")
        public void myPointCut(){}

  //切入点方法执行前调用

  @Before("myPointCut()")
        public void beforeTest(JoinPoint p){
            System.out.println(p.getSignature().getName()+" before...");
        }

  //切入点方法执行期间抛出异常的时候,会调用这个

  @AfterThrowing(value="myPointCut()",throwing="ex")
        public void throwingTest(JoinPoint p,Exception ex){
            System.out.println(p.getSignature().getName()+" is throwing..."+ex.getMessage());
            
        }
        
    }

  xml配置:
    <aop:aspectj-autoproxy/>
    <context:component-scan base-package="com.briup.aop"/>

注意:<aop:aspectj-autoproxy proxy-target-class="true"/>这样配置则是强制使用CGLIB进行代理

sping中AOP的更多相关文章

  1. Spring中AOP原理,源码学习笔记

    一.AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级 ...

  2. Spring中AOP简介与切面编程的使用

    Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...

  3. 第四节:MVC中AOP思想的体现(四种过滤器)并结合项目案例说明过滤器的实际用法

    一. 简介 MVC中的过滤器可以说是MVC框架中的一种灵魂所在,它是MVC框架中AOP思想的具体体现,所以它以面向切面的形式无侵入式的作用于代码的业务逻辑,与业务逻辑代码分离,一经推出,广受开发者的喜 ...

  4. 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)

    一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...

  5. Spring中AOP实现

    1.什么是SpringAOP 什么是aop:Aspect Oriented Programming的缩写,面向切面编程,通过预编译和动态代理实现程序功能的 统一维护的一种技术 主要功能:日志记录,性能 ...

  6. Spring 中aop切面注解实现

    spring中aop的注解实现方式简单实例   上篇中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了. 注解方式实现aop我们 ...

  7. Spring中AOP相关源码解析

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

  8. 11 Sping框架--AOP的相关概念及其应用

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

  9. AOP 与 Spring中AOP使用(上)

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

随机推荐

  1. Wannafly Camp 2020 Day 3C 无向图定向

    请你把无向图的每条边确定一个方向,使之成为一个DAG,并且最小化最长路的长度. #include <bits/stdc++.h> using namespace std; int n,m, ...

  2. h264 RTP STAP-A单时间聚合包

    参考官方文档:http://www.rosoo.net/Files/UpFiles/RsProduct/avtools/2009-4/2009491562537854.txt 聚合包的RTP荷载格式的 ...

  3. 剑指offer 面试题 删除链表中重复的节点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  4. GIT如何根据历史记录回退代码

    ps: 因为使用这种方式回退后,回退的目标版本之后提交的代码都没了,所以建议先把当前代码打个tag 首先找到分支的提交记录 git log 将代码回退到历史版本 git reset --hard 0f ...

  5. 数据库程序接口——JDBC——初篇——目录

    目录 建立连接 核心对象 Driver DriverManager Connection DataSource 常用功能 第一个程序 C3P0数据源 DBCP数据源 事务之Spring事务 执行SQL ...

  6. 重新装Mysql后原来数据的恢复办法:即一个版本的mysql的data文件夹下的所有的数据,怎么去加载到另一个安装的mysql中

    重新装Mysql后原来数据的恢复办法本博客:http://blog.csdn.net/xiaowu_zhu/article/details/71188955 不管是重新装系统或者数据库时,总会遇到怎么 ...

  7. 三分钟快速上手TensorFlow 2.0 (上)——前置基础、模型建立与可视化

    本文学习笔记参照来源:https://tf.wiki/zh/basic/basic.html 学习笔记类似提纲,具体细节参照上文链接 一些前置的基础 随机数 tf.random uniform(sha ...

  8. Ubuntu16.04安装TORCS

    下载torch安装包: git clone https://github.com/torch/distro.git torch --recursive 安装依赖库: cd torch/ sudo ba ...

  9. 深入理解JDK、JRE(两套)、JVM、以及不同目录下的java.exe

    内容来自:http://blog.sina.com.cn/s/blog_7ffb8dd501011sgc.html 1.jdk下bin目录里的java.exe与外部jre中的java.exe的秘密   ...

  10. 谈谈我对Promise的理解

    一.Promise是什么? Promise是最早由社区提出和实现的一种解决异步编程的方案,比其他传统的解决方案(回调函数和事件)更合理和更强大. ES6 将其写进了语言标准,统一了用法,原生提供了Pr ...