分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net

a. 连接点(Joinpoint):程序执行的某个特定位置(如:某个方法调用前、调用后,方法抛出异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。Spring仅支持方法的连接点。 
b. 切点(Pointcut):如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。 
c. 增强(Advice):增强是织入到目标类连接点上的一段程序代码。Spring提供的增强接口都是带方位名的,比如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。很多资料上将增强译为“通知”,这明显是个词不达意的翻译,让很多程序员困惑了许久。

说明: Advice在国内的很多书面资料中都被翻译成"通知",但是很显然这个翻译无法表达其本质,有少量的读物上将这个词翻译为"增强",这个翻译是对Advice较为准确的诠释,我们通过AOP将横切关注功能加到原有的业务逻辑上,这就是对原有业务逻辑的一种增强,这种增强可以是前置增强、后置增强、返回后增强、抛异常时增强和包围型增强。

d. 引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过引介功能,可以动态的为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。 
e. 织入(Weaving):织入是将增强添加到目标类具体连接点上的过程,AOP有三种织入方式:①编译期织入:需要特殊的Java编译器(例如AspectJ的ajc);②装载期织入:要求使用特殊的类加载器,在装载类的时候对类进行增强;③运行时织入:在运行时为目标类生成代理实现增强。Spring采用了动态代理的方式实现了运行时织入,而AspectJ采用了编译期织入和装载期织入的方式。 
f. 切面(Aspect):切面是由切点和增强(引介)组成的,它包括了对横切关注功能的定义,也包括了对连接点的定义。

补充:代理模式是GoF提出的23种设计模式中最为经典的模式之一,代理模式是对象的结构模式,它给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。简单的说,代理对象可以完成比原对象更多的职责,当需要为原对象添加横切关注功能时,就可以使用原对象的代理对象。我们在打开Office系列的Word文档时,如果文档中有插图,当文档刚加载时,文档中的插图都只是一个虚框占位符,等用户真正翻到某页要查看该图片时,才会真正加载这张图,这其实就是对代理模式的使用,代替真正图片的虚框就是一个虚拟代理;Hibernate的load方法也是返回一个虚拟代理对象,等用户真正需要访问对象的属性时,才向数据库发出SQL语句获得真实对象。

下面用一个找枪手代考的例子演示代理模式的使用:

package chimomo.learning.java.designpattern.proxy.gunman;/*** 参考人员接口** @author Created by Chimomo*/
public interface Candidate {/*** 答题*/void answerTheQuestions();
}
package chimomo.learning.java.designpattern.proxy.gunman;/*** 懒学生** @author Created by Chimomo*/
public class LazyStudent implements Candidate {// 姓名private String name;public LazyStudent(String name) {this.name = name;}@Overridepublic void answerTheQuestions() {// 懒学生只能写出自己的名字不会答题System.out.println("姓名: " + name);}
}
package chimomo.learning.java.designpattern.proxy.gunman;/*** 枪手** @author Created by Chimomo*/
public class Gunman implements Candidate {// 被代理对象private Candidate target;public Gunman(Candidate target) {this.target = target;}@Overridepublic void answerTheQuestions() {// 枪手要写上代考的学生的姓名target.answerTheQuestions();// 枪手要帮助懒学生答题并交卷System.out.println("奋笔疾书正确答案");System.out.println("交卷");}
}
package chimomo.learning.java.designpattern.proxy.gunman;/*** @author Created by Chimomo*/
public class GunmanTest {public static void main(String[] args) {Candidate c = new Gunman(new LazyStudent("王小二"));c.answerTheQuestions();}
}// Output:
/*
姓名: 王小二
奋笔疾书正确答案
交卷*/

说明:从JDK 1.3开始,Java提供了动态代理技术,允许开发者在运行时创建接口的代理实例,主要包括Proxy类和InvocationHandler接口。下面的例子使用动态代理为ArrayList编写一个代理,在添加和删除元素时,在控制台打印添加或删除的元素以及ArrayList的大小:

package chimomo.learning.java.designpattern.proxy.listproxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.List;/*** @author Created by Chimomo*/
public class ListProxy<T> implements InvocationHandler {private List<T> target;public ListProxy(List<T> target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object retVal = null;System.out.println("[" + method.getName() + ": " + args[0] + "]");retVal = method.invoke(target, args);System.out.println("[size=" + target.size() + "]");return retVal;}
}
package chimomo.learning.java.designpattern.proxy.listproxy;import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;/*** @author Created by Chimomo*/
public class ListProxyTest {@SuppressWarnings("unchecked")public static void main(String[] args) {List<String> list = new ArrayList<>();Class<?> clazz = list.getClass();ListProxy<String> myProxy = new ListProxy<>(list);List<String> newList = (List<String>) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), myProxy);newList.add("apple");newList.add("banana");newList.add("orange");newList.remove("banana");}
}// Output:
/*
[add: apple]
[size=1]
[add: banana]
[size=2]
[add: orange]
[size=3]
[remove: banana]
[size=2]*/

说明:使用Java的动态代理有一个局限性就是代理的类必须要实现接口,虽然面向接口编程是每个优秀的Java程序都知道的规则,但现实往往不尽如人意,对于没有实现接口的类如何为其生成代理呢?继承!继承是最经典的扩展已有代码能力的手段,虽然继承常常被初学者滥用,但继承也常常被进阶的程序员忽视。CGLib采用非常底层的字节码生成技术,通过为一个类创建子类来生成代理,它弥补了Java动态代理的不足,因此Spring中动态代理和CGLib都是创建代理的重要手段,对于实现了接口的类就用动态代理为其生成代理类,而没有实现接口的类就用CGLib通过继承的方式为其创建代理。

Java - 你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?相关推荐

  1. java args例子_Spring AOP中使用args表达式的方法示例

    本文实例讲述了Spring AOP中使用args表达式的方法.分享给大家供大家参考,具体如下: 一 配置 xmlns:xsi="http://www.w3.org/2001/XMLSchem ...

  2. java抽象的理解_Java中抽象类的理解

    Java中抽象类的理解 创建   所有   bsp   抽象类   member   初始   dem   print ---------------------------------------- ...

  3. java 前置通知_spring aop中的前置通知

    fixassetService myInterceptor myInterceptor2 在上面的配置文件中 我配置了两个interceptor ,这两个interceptor的invoke方法中的逻 ...

  4. java map的理解_java中的hashmap理解

    Asp.net Boilerplate之AbpSession扩展 当前Abp版本1.2,项目类型为MVC5. 以属性的形式扩展AbpSession,并在"记住我"后,下次自动登录也 ...

  5. java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...

    一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...

  6. java方法设置切点_java相关:Spring AOP中定义切点的实现方法示例

    java相关:Spring AOP中定义切点的实现方法示例 发布于 2020-6-6| 复制链接 摘记: 本文实例讲述了Spring AOP中定义切点的实现方法.分享给大家供大家参考,具体如下:一 配 ...

  7. aop实现原理_从宏观的实现原理和设计本质入手,带你理解 AOP 框架的原理

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:FeelsChaotic juejin.im/post/5c57b2d5e51d45 ...

  8. eclipse aop连接点joinpoint方法点不出来_(面试必备)你必须要懂的Spring-Aop

    在实际研发中,Spring是我们经常会使用的框架,毕竟它们太火了,也因此Spring相关的知识点也是面试必问点,今天我们就大话Aop. 特地在周末推文,因为该篇文章阅读起来还是比较轻松诙谐的,当然了, ...

  9. 从宏观的实现原理和设计本质入手,带你理解 AOP 框架的原理

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:FeelsChaotic juejin.im/post/5c57b2d5e51d45 ...

最新文章

  1. leetcode_894. All Possible Full Binary Trees
  2. Update msi using vbscript
  3. .NET六大剑客:栈、堆、值类型、引用类型、装箱和拆箱
  4. MySQL的my.cnf文件(解决5.7.18下没有my-default.cnf)
  5. Unity3D获取Andorid设备返回键,主页键等功能
  6. Tensorflow框架:目标检测Yolo思想
  7. PAT 1148 Werewolf – Simple Version – 甲级
  8. 在全员编程时代下,软件测试员又该何去何从?
  9. git二分法查找命令说明
  10. spring boot-html和templates
  11. 面向大众征集 “故宫·金榜题名”文创众筹大赛启动
  12. google地图瓦片地址
  13. 北京-京医通-小孩-人脸识别
  14. 《Adaptive Unimodal Cost Volume Filtering for Deep Stereo Matching》
  15. 电脑无法连接wifi得解决方法
  16. windows快捷方式
  17. canvas画圆环(一)之渐变色,纯色
  18. 阿里云虚拟主机 mysql_阿里云虚拟主机数据库用户操作是怎样的
  19. 2, excel vba 来一个简单好玩的
  20. 删除swap分区后,Archlinux开机报[failed]failed to start Load/Save Screen Backlight Brightness

热门文章

  1. JdbcTemplate空指针异常
  2. 天津化工杂志天津化工杂志社天津化工编辑部2022年第3期目录
  3. 逻辑思维案例题(二)
  4. 服务器虚拟机化对应云计算的,服务器虚拟化与云计算
  5. Msg 15138 The database principal owns a schema in the database, and cannot be dropped.
  6. 1. 微信开发-自动回复
  7. PLC按时间启停设备运转,设备到期停止设备运转
  8. squid 3 反向代理 缓存服务器 安装配置精华指南 by lbj
  9. 链接标签a去掉下划线
  10. java fx 重绘_JavaFX 2.2:如何强制重绘/更新ListView