Spring框架系列之AOP思想
微信公众号:compassblog
欢迎关注、转发,互相学习,共同进步!
有任何问题,请后台留言联系!
1、AOP概述
(1)、什么是 AOP
AOP 为 Aspect Oriented Programming 的缩写,意为“面向切面编程”。AOP 是 OOP (面向对象)的延续,可以对业务的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性和开发效率。
(2)、AOP 思想图解:横向重复,纵向切取
过滤器
拦截器
事务管理
(3)、AOP 可以实现的功能
权限验证
日志记录
性能控制
事务控制
(4)、AOP 底层实现的两种代理机制
JDK的动态代理 :针对实现了接口的类产生代理
Cglib的动态代理 :针对没有实现接口的类产生代理,应用的是底层的字节码增强的技术生成当前类的子类对象
2、Spring底层AOP实现原理
(1)、 JDK 动态代理增强一个类中方法:被代理对象必须要实现接口,才能产生代理对象。如果没有接口将不能使用动态代理技术。
public class MyJDKProxy implements InvocationHandler {
private UserDao userDao;
public MyJDKProxy(UserDao userDao) { this.userDao = userDao; }
public UserDao createProxy(){ UserDao userDaoProxy = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(), this); return userDaoProxy; }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if("save".equals(method.getName())){ System.out.println("权限校验============= } return method.invoke(userDao, args); } }
(2)、Cglib 动态代理增强一个类中的方法:可以对任何类生成代理,代理的原理是对目标对象进行继承代理。如果目标对象被final修饰,那么该类无法被cglib代理。
public class MyCglibProxy implements MethodInterceptor{
private CustomerDao customerDao;
public MyCglibProxy(CustomerDao customerDao){ this.customerDao = customerDao; }
// 生成代理的方法: public CustomerDao createProxy(){ // 创建Cglib的核心类: Enhancer enhancer = new Enhancer(); // 设置父类: enhancer.setSuperclass(CustomerDao.class); // 设置回调: enhancer.setCallback(this); // 生成代理: CustomerDao customerDaoProxy = (CustomerDao) enhancer.create(); return customerDaoProxy; }
@Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { if("delete".equals(method.getName())){ Object obj = methodProxy.invokeSuper(proxy, args); System.out.println("日志记录================"); return obj; } return methodProxy.invokeSuper(proxy, args); }}
3、Spring 基于 AspectJ AOP 开发的相关术语
Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点
Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义
Advice(通知/增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Introduction(引介):引介是一种特殊的通知,在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field
Target(目标对象):代理的目标对象
Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装在期织入
Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类
Aspect(切面):是切入点和通知(引介)的结合
您可能还喜欢:
Spring框架系列(二)之Bean的注解管理
【SSH框架】之Spring系列(一)
【SSH框架】之Hibernate系列(一)
讲讲本人本专业找工作的那些事儿
前端系列之JavaScript基础知识概述
本系列后期仍会持续更新,欢迎关注!
如果你认为这篇文章有用,欢迎转发分享给你的好友!
本号文章可以任意转载,转载请注明出处!
扫码关注微信公众号,了解更多
转载于:https://www.cnblogs.com/compassblog/p/8486478.html
Spring框架系列之AOP思想相关推荐
- Spring 框架蕴含的设计思想
在 Google Guava 源码讲解中,我们讲到开发通用功能模块的一些比较普适的开发思想,比如产品意识.服务意识.代码质量意识.不要重复早轮子等.今天,我们剖析一下 Spring 框架背后的一些经典 ...
- Spring的IOC和AOP思想
Spring框架的两大核心(ioc和aop) 一.ioc:控制反转(Inversion of Control)思想 1.1.由spring来负责控制对象的生命周期和对象间的关系(SSM框架中的依赖关系 ...
- Spring框架IOC和AOP的实现原理
IoC(Inversion of Control) (1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控.控制权由应用代码中 ...
- Spring框架IOC和AOP的实现原理(概念)
IoC(Inversion of Control) (1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控.控制权由应用代码中 ...
- Spring框架(IoC、AOP面向接口切面)
新建一个Maven工程 Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开发. ...
- java aop模式_Java的Spring框架下的AOP编程模式示例
Spring框架的关键组件是面向方面编程(AOP)框架.面向方面的编程不仅打破程序逻辑分成不同的部分称为所谓的担忧.跨越多个点的应用程序的功能被称为横切关注点和这些横切关注点是从应用程序的业务逻辑概念 ...
- 每天一点儿时间学习Spring框架系列—IOC(2)
每天一点儿时间学习Spring框架--Ioc(2) 前篇简单入门了Spring的结构,这次就来开始讨论其中的控制反转的思想和自己的一些编写实例分享.(编写不一定能够完美的实现,建议大家了解其中的基本步 ...
- spring框架:简述AOP的使用(xml方式和注解方式)
本人小白一枚,欢迎大家一起讨论学习,如有错误,还望大家指教. AOP概述 AOP的概念: AOP,全称Apect Oriented Programming,译为面向切面编程,简单的说它可以帮我们把程序 ...
- java 耦合度_Java第三十八天,Spring框架系列,使用工厂模式降低程序耦合度
一.什么是耦合 程序之间的依赖关系: ①类之间的依赖 ②方法之间的依赖 注意: 不可能完全的消除依赖关系,而只能是降低程序之间的依赖关系 二.解耦 降低程序之间的依赖关系: 1.解决类之间的依赖关系: ...
最新文章
- Singleton Pattern
- (0046) iOS开发之View的frame和bounds之解惑
- 网页截图工具CutyCapt
- 应该始终以PreparedStatement代替Statement
- 在word中的公式以代码形式体现在web上的方法
- 深度揭秘:大数据时代企业卖技术还是卖数据?
- 定义简单类-创建多个猫对象
- 卸载 系统打印服务器,win10系统打印机驱动卸载不掉的方案介绍
- python访问网页变量_Python 如何访问外围作用域中的变量
- 计算机版初中语文课文原文,《背影》课文原文
- oracle 00283,数据库出现ORA-00283/ORA-01610的问题
- 使用Prometheus+grafana打造高逼格监控平台
- linux定时任务生效_Linux 添加定时任务
- 2.CND技术详解---CDN技术概述
- 【jQuery】jQuery对象与prevObject
- 2022蓝桥模拟-子汉诺塔
- 微信支付退款 升级版 【码云gvp 】
- 华硕Fonepad 8、MeMO Pad 7以及MeMO Pad 8也随之登场
- Core Data详解
- c语言程序电压采样,单片机电压采集装置课程设计(AD转换及编程实现).doc
热门文章
- java压缩解压缩类实例[转]
- usaco Network of Schools
- matepad和鸿蒙,爆料称华为MatePad 2系列平板有三个版本:预装鸿蒙OS
- noip复赛普及组2020_我校学子在2020年“外研社·国才杯”全国英语写作大赛(高职组)复赛中斩获佳绩...
- android 汉字编码,Android解压中文乱码
- 手写java_手写JAVA虚拟机(二)——实现java命令行
- 侏罗纪怪兽世界怎么登陆服务器未响应,全金属怪物进不去怎么解决
- 计算机二级理工类报哪个,计算机二级考哪一科目,毕业后找工作会对科目有要求吗?还是说不管什么科目有证就行了?...
- 化工学python_化工计算与软件应用(第2版) PDF
- python tensorflow教程_TensorFlow入门教程TensorFlow 基本使用T