面向切面

article/2025/8/18 19:37:33

面向切面是什么

AOP即面向切面编程。

让你只专注于核心业务功能的实现,而不用花太多精力去管像日志、事务等各个项目通用的功能。

把非核心的业务逻辑抽象成一个切面,在程序运行过程中自动注入该功能,这就是面向切面,其底层是通过动态代理的机制来实现的,支持jdk和cglib两种。

将分散于业务代码各处的日志、事务、安全等功能代码抽离出成为一个单独的工具组件,在Spring的配置中将其进行声明为一个功能切面,再告诉Spring你想在哪些地方、什么时机使用这些可重用组件。

什么是代理模式?代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托列的对象的相关方法,来提供特定服务。

按照代理类的创建时期,代理类可分为两种,第一种是静态代理,友臣古西亚UN创建或特定工具自动生成源代码,再对其编译,在程序运行之前,代理类的.class文件就已经存在了。第二种是动态代理,在程序运行时,运用反射机制动态创建而成。

静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。静态代理事先知道要代理什么,而动态代理不需要知道代理什么,只有在运行时才知道。

JDK动态代理

1、在dao层新建一个演戏的Act接口

写出演戏的抽象方法

//演戏的接口
public interface Act {//抽象方法public void act(); //演戏的方法
}

2、在domain层新建一个演员的抽象类,名字为Actorr.class

写出演戏的抽象方法

// 演员抽象类
public abstract class Actor implements Act {}

3、在domain层新建一个Bean类,名字为ChengLong.class

继承Actor接口,重写抽象方法

//成龙类
public class ChengLong extends Actor {@Overridepublic void act() {System.out.println("我是成龙,我正在拍戏....");}
}

4、在proxy代理层新建一个成龙代理类,名字为ChengLongProxy

实现调用处理器InvocationHandler接口,重写抽象方法

//成龙的经纪人
public class ChengLongProxy implements InvocationHandler {// 目标对象,成龙经纪人目标对象肯定是成龙private Object targetObject;//传入一个代理之前的对象,返回一个被代理对象。public Object newProxyInstance(Object targetObject){this.targetObject=targetObject;return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getSuperclass().getInterfaces(),this);}//演戏之前要做的事情private void beforeAct(){System.out.println("谈档期..");System.out.println("谈片酬");System.out.println("谈广告合作");}//演戏之后要做的事情private void afterAct(){System.out.println("谈出席首映仪式");System.out.println("谈出席颁奖典礼..");}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object ret = null;this.beforeAct();ret=method.invoke(targetObject, args); //调用真正成龙演戏的方法this.afterAct();return ret;}
}

5、写主方法

public static void main(String[] args) {//创建一个没有经纪人的成龙Act actor = new ChengLong();//获得有经纪人的成龙actor = (Act) new ChengLongProxy().newProxyInstance(actor);//执行演戏方法,经纪人自动帮成龙处理演戏前后的事情,成龙只需专注演戏actor.act();
}

6、运行结果

在这里插入图片描述

cglib动态代理

1、在dao层新建一个演员抽象类,名字为Player.class

写出演戏的抽象方法

//演员类,是抽象类
public abstract class Player {//演戏的方法public abstract void play();
}

2、在domain层新建一个MovieStar抽象类

public abstract class MovieStar extends Player {}

3、在domain层新建JackChen类

继承MovieStar 抽象方法

public class JackChen extends MovieStar {@Overridepublic void play() {System.out.println("我是JackChen,我正在拍戏....");}
}

4、在proxy层新建JackChen的代理对象,名字为JackChenProxy.class

实现方法拦截器MethodInterceptor 接口

public class JackChenProxy implements MethodInterceptor {// 目标对象,成龙经纪人目标对象肯定是成龙private Object targetObject;//传入一个代理之前的对象,返回一个被代理对象public Object newProxyInstance(Object targetObject){this.targetObject=targetObject;//创建enhancer对象(增强器)Enhancer enhancer = new Enhancer();// 设置enhancer对象的父类enhancer.setSuperclass(this.targetObject.getClass().getSuperclass().getSuperclass());// 设置enhancer的回调对象enhancer.setCallback(this);// 创建代理对象return (Player)enhancer.create();}//演戏之前要做的事情private void beforeAct(){System.out.println("谈档期..");System.out.println("谈片酬");System.out.println("谈广告合作");}//演戏之后要做的事情private void afterAct(){System.out.println("谈出席首映仪式");System.out.println("谈出席颁奖典礼..");}@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {Object ret = null;this.beforeAct();//调用成龙真正的演戏方法ret =method.invoke(this.targetObject,objects);this.afterAct();return ret;}
}

5、写主方法

public static void main(String[] args) {//通过cglib实现的动态代理//没有经纪人的JackChen对象Player actor = new JackChen();//获得有经纪人的JackChenactor = (Player) new JackChenProxy().newProxyInstance(actor);actor.play();}

7、运行程序,输出结果

在这里插入图片描述


http://chatgpt.dhexx.cn/article/UE9MDf5Y.shtml

相关文章

Spring AOP 之 多切面

接着上文:https://blog.csdn.net/single_wolf_wolf/article/details/81772837 多切面 相对来说,只是定义多个切面类,同时配置类中设置一下, demo如下: 首先定义一个接口: package com.cmb.multi;public…

spring切面注解失效

在项目中使用切面注解做数据脱敏时,导出的数据也需要脱敏处理,遇到了在一个类里面调用本类的方法切面失效,解决方法如下: 切面注解: package com.t3.ts.driver.resume.aspect;import java.lang.annotation.*;/*** Description: 数据脱敏注解 Filed* Date: 2019/9/10* Author:…

自定义切面类

直接贴入代码 ,注释写的很清楚 此处为controller层 方法上加上自定义的切面注解 入参实体 public class TestM extends BaseModel{/****/private static final long serialVersionUID 1L; private String a;public String getA() {return a; }public void setA(S…

java 切面 注解_十、使用注解定义切面

一、本课目标 掌握使用注解实现AOP的方法 二、使用注解定义切面 2.1简介 AspectJ 面向切面的框架,它扩展了Java语言,定义了AOP语法,能够在编译期提供代码的织入。 @AspectJ AspectJ5新增的功能,使用JDK5.0注解技术和正规的AspectJ切点表达式语言描述切面(所以在使用@Aspect…

Spring 创建切面

目录 1、概述 2、切点类型 3、切面类型 4、静态普通方法名匹配切面 5、静态正则表达式方法匹配切面 6、动态切面 7、流程切面 8、复合切点切面 9、总结 1、概述 在前面介绍各类增强时,大家可能没有注意到一个问题:增强被织入到目标类的所有方法…

Spring基础:切面

前言在之前的文章中总结了 AOP 在 Spring 中的作用及地位,在分析 AOP 时涉及到切面的内容,这一节详细的分析切面的知识点。 正题 在开始文章前,有几个问题需要思考一下: 切面到底是神马切面的构成切面有哪些实现类切面有哪些类型…

java使用spring aop切面编程

aop概念 1、切面(Aspect) 首先要理解‘切’字,需要把对象想象成一个立方体,传统的面向对象变成思维,类定义完成之后(封装)。每次实例化一个对象,对类定义中的成员变量赋值,就相当于对这个立方体…

【Spring】面向切面编程详解(AOP)

文章目录 一、AOP概述什么是AOPAOP应用场景 二、AOP的基本术语术语介绍术语举例详解 三、AOP实例说明四、通知类型详解概述前置通知后置通知环绕通知最终通知 六、AOP实现声明式事务结语 🌕博客x主页:己不由心王道长🌕! 🌎文章说明…

时间序列预测方法

之前一直在看时间序列预测方法的文献,最近终于有点头绪了,然后就花了些时间来做一下整理。时间序列预测方法可分为传统的,基于机器学习的和基于深度学习的,以下每一方面都列举了几个比较经典的模型算法。 目录 1 背景 2 传统的时…

时间序列预处理

数据预处理的主要流程为:数据清洗、特征选择、归一化处理、划分窗口、Shuffle和划分数据集等五个阶段。选用何种方法没有统一的标准,只能根据不同类型的分析数据和业务需求,在对数据特性做了充分的理解之后,再选择与其最适配的数据…

时间序列分析相关概念

1. 在时间序列分析中, 数学模型是什么?数学公式又是什么?数学推导过程又是什么?… … 一句话:用数学公式后者符号来表示现实存在的意义。数学是“万金油”的科学,它是作为工作和分析方法运用到某个学科当中…

时间序列预测方法总结

前言 对时间序列数据预测模型做个简单的分类,方便日后对其进一步研究,理清楚技术更新发展方向。 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征。 预测场景 单步预测 单步单变量预测 :在时间序…

时间序列的聚类方法

时间序列的聚类方法 时间序列是按照时间排序的一组随机变量,它通常是在相等间隔的时间段内,依照给定的采样率,对某种潜在过程进行观测的结果。 时间序列数据是实值型的序列数据,具有数据量大、数据维度高以及数据是不断更新的等…

【时间序列预测】Autoformer 长时间序列预测

论文链接:http://xxx.itp.ac.cn/pdf/2106.13008.pdf Abstract 延长预测时间是极端天气预警和长期能源消耗规划等实际应用的关键需求。本文研究时间序列的长期预测问题。先前的基于 Transformer 的模型采用各种 self-attention 机制来发现长期依赖关系。然而&…

时间序列分析预测

全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 时间序列中常用预测技术,一个时间序列是一组对于某一变量连续时间点或连续时段上的观测值。参考:https://blog.csdn.net/u010414589/article/details/49622625…

时间序列预测

问题简介 简单来说,时间序列是按照时间顺序,按照一定的时间间隔取得的一系列观测值,比如我们上边提到的国内生产总值,消费者物价指数,利率,汇率,股票价格等等。时间间隔可以是日,周…

时间序列分析

http://blog.csdn.net/pipisorry/article/details/62053938 时间序列简介 时间序列是时间间隔不变的情况下收集的时间点集合。这些集合被分析用来了解长期发展趋势,为了预测未来或者表现分析的其他形式。但是什么时间序列?与常见的回归问题的不同&…

时间序列模型调查

RNN 模型 Recurrent Neural Network (回流神经网络,有的译做递归神经网络) 时间序列模型最常用最强大的的工具就是递归神经网络(recurrent neural network, RNN)。相比与普通神经网络的各计算结果之间相互独立的特点,RNN的每一次隐含层的计算结果都与当前输入以及上一次的…

时间序列模型

1. 时间序列分析方法概述 一个时间序列往往是一下几类变化形式的叠加或耦合。 (1)长期趋势变动:反映主要变化趋势; (2)季节变动 (3)循环变动 (4)不规则变动 使…

python创建时间序列_python 时间序列

将dataframe的列转化为时间序列 #https://www.cnblogs.com/bolgbjg/p/14013300.html #datetime.now()获取现在的时间,now.year,获取现在的年份,其他以此类推 #timedelta()表示两个datetime之间的时间差,默认单位是天 strftime()参数, strftim…