一、引入
如果要你完成几项功能,功能中每一个都需要日志进行记录方法对应的开始时间和完成时间以及整体花费时间。那最原始的方法就是在每一个方法的前面都输出一个时间,在末尾又输出一个时间,然后两个相减就得到执行完整个方法的时间。可是你想每一个方法都要一个输入、输出、相减得到结果,我们可不可以直接用一个东西只写一次就直接完成这些功能呢?好,那么我们就来看看今天要说的一个Spring中很重要的东西,就是SpringAOP。
二、SpringAOP的简单介绍
1.什么是AOP?
AOP:全称Aspect Oriented Programming意为“面向切面编程”,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善,OOP引入封装、继承、多态等概念来建立一种对象层次结构,AOP则利用一种称为“横切”的技术,剖开对象内部,并将公共行为封装到可重用模块,从而减少重复代码,降低耦合。AOP 的核心思想是将横切关注点从应用程序的核心业务逻辑中分离出来,并以模块化的方式实现。
2.什么是SpringAOP?
SpringAOP:是 Spring Framework 提供的一种实现 AOP 的方式。它通过基于代理的动态织入机制,使得应用程序可以方便地应用切面,并实现横切关注点的模块化。通过 Spring AOP,您可以以声明性的方式管理事务、应用通知等,从而提高代码的可维护性和可测试性。
总的来说SpringAOP是Spring提供的一个框架,用来实现AOP的一种方式。
三、关于AOP的相关术语
1、切面(Poincut)
切面是指封装横切到系统功能的类,包含通知和切点。
2、切点(Aspect)
切点是指切面插入在哪些方法上,确定使用范围。
3、通知(Advice)
通知是指切点处要执行的程序代码以及执行时机。
4、连接点(Join point)
连接点是指应用执行过程中满足切点范围的具体的点。
5、织入(Weaving)
织入是把切面插入到目标对象上。
以上就是大致用到一些术语。
四、通知类型
前置通知:使用aop:before标签,在方法之前执行;
后置通知:使用aop:after标签,在方法之后执行,无论方法内部是否抛出异常;
后置返回通知:使用aop:after-returning标签,在方法之后执行并且方法内部不能抛出异 常;
后置异常通知:使用aop:after-throwing标签,在方法内部抛出异常时执行;
环绕通知:使用aop:around标签,在方法之前和之后都执行;
说明:前四种通知的方法里面我们可以通过JoinPoint参数获取连接点信息,比如参数信息等,方便进行处理;环绕通知的方法里我们通过ProceedingJoinPoint参数来获取连接点信息。
五、SpringAOP的使用基本配置
1.新增一个日志类一个日志写入方法
//日志服务
@Service
public class LogService {
//记录日志
private void writeLog () {
System. out. println ("开始执行service,时间:"+new Date () . tolocaleString() ) ;
}
2.引入关于Spring-AOP以及aspect的相关依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.9</version>
</dependency
2.在Spring配置文件头部添加相关的内容(因为要使用aop标签)
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
3.在Spring配置文件中配置
<!-- AOP配置根节点-->
<aop:config>
<!--定义切点-->
<aop:pointcut expression= "execution(* service. *.*(..))"
id= "pointcut" />
<!--定义切面-->
<aop:aspect ref= "logService">
<!--定义前置通知-->
<aop:before pointcut-re f= "pointcut" method= "wri teLog" />
</ aop: aspect>
</ aop: config>
说明:
1.aop:config标签配置所有的切面
2.aop:pointcut标签配置切点,使用切点表达式来指定范围
3.这条语句为切点表达式,用于定义切面拦截方法调用点的规则。切点表达式可以精确定位方法调用点、支持通配符、简化配置文件等,使得AOP更加灵活便捷。
4.通过aop:aspect定义切面,指定引用的通知以及通知的类型和切点.
4.修改日志类
//日志服务
@Service
public class LogService {
//记录日志
private void wri teLog (JoinPoint point) {
//从连接点获取方法名
String methodName=point . getSignature() . getName () ;
//从连接点获取参数
Object[] args=point.getArgs() ;
System.out.println ("开始执行service,时间: "
+ new Date().toLocaleString()) ;
System. out. println ("service方法名: "+methodName) ;
System. out.print ("传递参数信息: ") ;
for (Object arg : args) {
System. out.print (arg. toString()+",") ;
}
System. out. println("") ;
}
}
六、最后
以上就是我今天要分享的关于SpringAOP的全部内容啦! 我这里只是很笼统的讲解了一下SpringAOP的一些很基础的东西,如果想要系统学习的同学可以当一个小入门看看喔!如果对各位友友们有帮助的话请点赞关注支持一下吧,这是我们的一个课堂小结作业,如果有什么错误也请指出,我会定期查看修改的!谢谢!