AOP 学习笔记

时间:2023-02-17 21:33:45

  代理是一个设计模式,提供了对目标对象另外的访问方式;即通过代理访问目标对象。

  好处:可以在目标对象实现的基础上,增强额外的功能操作。

  Cglib 代理,也叫作 子类代理。

  JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的类,就可以使用CGLIB 实现。

  CGLIB 是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java 接口。它广泛的被许多AOP的框架使用,例如 SpringAOP 和dynaop,为他们提供方法的 interception (拦截)

  CGLIB 包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。

cglib 子类代理

  1) 需要引入 cglib.jar 文件,不过spring 的核心包中已经包含了cglib 功能,只需要引入 spring-core*

  2)引入功能包后,就可以在内存中动态构建子类

  3) 代理的类不能是 final,否则报错

  4) 目标对象的方法如果为 final/static ,那么就不会被拦截,即不会执行目标对象额外的业务方法

在Spring的AOP 编程中

  如果加入容器的目标对象有实现接口,用JDK 代理

  如果目标对象没有实现接口,用CGLIB 代理

AOP 面向切面的编程

  AOP 可以实现“业务代码” 与 “关注点代码” 分离

//保存一个用户
public void add(User user)
{
Session session = null;
Transaction trans = null;
try
{
session = HibernateSessionFactoryUtils.getSession(); //【关注点代码】
trans = session.beginTranstaion(); //【关注点代码】
session.save(user);//【核心业务代码】
trans.commit();//【关注点代码】
}catch(Exception e)
{
e.printStackTrace();
if(trans != null)
{
trans.rollback();//【关注点代码】
}
}finally
{
HibernateSessionFactoryUtils.closeSession(session);//【关注点代码】
}
}

分析总结:

  关注点代码,就是指重复执行的代码

  业务代码与关注点代码分离的好处

    关注点代码写一次即可

    可发者只需要关注核心业务

    运行期间,执行核心业务代码时候动态植入关注点代码【代理】

如何分离?

  过程式/对象式/代理模式分离

AOP 概念

AOP  aspect object programming 面向切面编程

  功能:让关注点和业务代码分离

关注点: 重复代码就叫作关注点

切面:关注点形成的类,就叫作切面

  面向切面编程,就是指 对很多功能都有重复的代码抽取,再在运行的时候 往 业务方法上动态植入“切面类代码”

切入点: 执行目标对象方法,动态植入切面代码

  可以通过切入点表达式,指定拦截哪些类的哪些方法,给指定的类在运行的时候植入切面类代码

方面(Aspect) 一个关注点的模块化,这个关注点实现可能另外横切多个对象。方面用spring的Advisor 或 拦截器实现

连接点(Joinpoint) :程序执行过程中明确的点,如方法的调用或特定的异常被抛出

通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”,“before”,“throws”通知。以拦截器做通知模型,维护一个“围绕”连接点的拦截器链

切入点(Pointcut):指定一个通知将引发一系列连接点的集合。AOP框架必须允许开发者指定切入点(例如使用正则表达式)

引入(Introduction): 添加方法或字段到被通知的类。Spring 允许引入新的接口道任何被通知的对象。

目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象

AOP代理(AOP Proxy):AOP 框架创建的对象,包含通知。在Spring中,AOP代理可以是Java代理 和 CGLIB 代理

编织(Weaving) : 组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

注解方式实现AOP编程

步骤:

1)先引入aop 相关jar 文件

  spring-aop-*.jar  aopalliance.jar   aspectjweaver.jar   aspectjrt.jar

2) bean.xml 引入aop 名称空间

3) 开启aop 注解

4) 使用注解

  @Aspect 指定一个类为切面类

  @Pointcut("execution(* com.panie.example.*.*(..))")  指定切入点表达式

  @Before("pointcut()")  前置通知:目标方法之前执行

  @After("pointcut()") 后置通知:目标方法之后执行

  @AfterReturining("pointcut()")  返回后通知:执行方法结束前执行(异常不执行)

  @AfterThrowing("pointcut()") 异常通知:出现异常时候执行

  @Around("pointcut()") 环绕通知:环绕目标方法执行

AOP 学习笔记的更多相关文章

  1. Spring入门IOC和AOP学习笔记

    Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容 ...

  2. Aop学习笔记

    在学习编程这段时间我想大家都是习惯了面向过程或者面向对象的思想来编程,较少或者没有接触过面向方面编程的思想. 那么什么是面向方面(Aspect)——其实就是与核心业务处理逻辑无关的切面,例如记录日志. ...

  3. AOP学习笔记一

    软件开发的目的是为了解决各种需求,包括业务需求和系统需求.目前,业界通过使用面向对象的编程思想,已经可以对业务需求等普通关注点进行很好的抽象与封装,并且使之模块化.但是对于系统需求一类的关注点来说,情 ...

  4. Spring AOP学习笔记01:AOP概述

    1. AOP概述 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期:为了便于维护和扩展,我们对某些相 ...

  5. Spring AOP学习笔记02:如何开启AOP

    上文简要总结了一些AOP的基本概念,并在此基础上叙述了Spring AOP的基本原理,并且辅以一个简单例子帮助理解.从本文开始,我们要开始深入到源码层面来一探Spring AOP魔法的原理了. 要使用 ...

  6. Spring AOP学习笔记03:AOP的核心实现之获取增强器

    上文讲了spring是如何开启AOP的,简单点说就是将AnnotationAwareAspectJAutoProxyCreator这个类注册到容器中,因为这个类最终实现了BeanPostProcess ...

  7. Spring AOP学习笔记05:AOP失效的罪因

    前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到 ...

  8. AOP学习笔记二

    Spring AOP采用Java作为AOP的实现语言(AOL),学习曲线平滑,Spring AOP对AspectJ也提供了很好的集成与支持.最为第二代的AOP,采用动态代理机制和字节码生产技术实现,在 ...

  9. Spring AOP学习笔记

      Spring提供了一站式解决方案:          1) Spring Core  spring的核心功能: IOC容器, 解决对象创建及依赖关系          2) Spring Web ...

随机推荐

  1. Guava 集合框架

    在本系列中我们首先来学习一些Guava的集合框架,也就是这个package:com.google.common.collect 在这个包下面有一些通用的集合接口和一些相关的类.   集合类型: BiM ...

  2. iOS-iOS 获取蓝色文件夹图片

    Xcode创建的iOS项目内存在两种文件夹:Group(黄色, 伪文件夹) 和Folder(蓝色, 真文件夹): Group: Folder: Images.xcassets或Group文件夹内的PN ...

  3. 摘抄--使用cos实现多个文件上传详解

    在开发中常常需要上传文件,上传文件的方式有很多种,这里有一个cos实现的例子. 首先是要拷贝cos.jar包拷贝到WEB-INF/lib目录下,然后才进行编码. 创建一个可以进行自动重命名的Java文 ...

  4. 通信行业OSS支撑系统软件研发思考

    一般的,对所谓大型.通信行业.OSS支撑软件系统,我们可宏观定义以下几点: 以年计的研发周期 以几十人计的研发团队 以百计的业务菜单功能点 以千计的数据库表 以万计的业务术语指标 以亿计的数据表记录 ...

  5. 使用 Azure Site Recovery 将内部部署虚拟化工作负荷迁移至 Azure

    ABHISHEK A. HEMRAJANI 云 + Enterprise 项目经理 我们最近发布了微软的灾难恢复即服务 (DRaaS) 产品的预览版 - Azure SiteRecovery.此产 ...

  6. Linux 安全模块

    LSM是Linux Secrity Module的简称,即linux安全模块.其是一种轻量级通用访问控制框架,适合于多种访问控制模型在它上面以内核可加载模块的形实现.用户可以根据自己的需求选择合适的安 ...

  7. 深入理解ES6之—对象

    Object新方法 Object.is()方法 在js中比较两个值时,你可能会用相等运算符==或者严格相等运算符 ===.为了避免在比较时发生强制类型转换,许多开发者更倾向于使用后者. Object. ...

  8. ●BZOJ 2209 [Jsoi2011]括号序列

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2209 题解: Splay 很好的题,但是把智障的我给恶心到了...   首先不难发现,最后没 ...

  9. MySQL从本地向数据库导入数据

    本文来自:https://www.cnblogs.com/lettuce-u/p/10715795.html(自己收藏看) 在localhost中准备好了一个test数据库和一个pet表: mysql ...

  10. 51Nod1367 完美森林 贪心

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1367.html 题目传送门 - 51Nod1367 题意 有一棵N个点的树,树中节点标号依次为0,1 ...