栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SSM之Spring中AOP的代码操作/IDEA如何使用AOP代码/AOP中切点、切面、连接点又是啥,怎么用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SSM之Spring中AOP的代码操作/IDEA如何使用AOP代码/AOP中切点、切面、连接点又是啥,怎么用

写在前面:
接着记录自己的Spring学习之旅,若看不懂则建议先看前几篇博文,详细代码可在我的Gitee仓库ssm-learning克隆下载学习使用!

1.9.3 AOP相关概念

在学习AOP的过程中会有相关术语,我们必须知道其所指含义,如下:

  • Target(代理对象):代理的目标对象
  • Proxyt(代理): 某个类被AOP增强后就会产生一个代理类
  • JoinPoint(连接点):被拦截到的点,这里点仅仅是指方法。
  • PointCut(切入点):对某些JoinPoint要进行拦截的定义
  • Advice(通知/增强):指拦截到的JoinPoint之后要做的事
  • Aspect(切面):切入点和通知的结合
  • Weaving(织入):指把增强应用到目标对象来创建新的代理对象的过程,Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
1.9.4 AOP开发明确事项 1.9.4.1 编写内容
  • 核心业务代码(目标类及方法)
  • 切面类,类中有通知(功能增强方法)
  • 配置文件中,配置织入关系即哪些通知与哪些连接点结合
1.9.4.2 技术实现内容流程 1.9.4.3 AOP使用哪种代理方式

Spring会根据目标类决定是否实现了接口来决定采用相应的代理方式

1.9.5 XML开发AOP 1.9.5.1 XML开发AOP步骤
  • 导入AOP相关坐标
  • 创建目标接口和目标类(内部有切点)
  • 创建切面类(内部有增强方法)
  • Spring接管目标类和切面类的对象创建权
  • xml配置织入
  • 测试代码
1.9.5.2 XML配置信息 1.9.5.2.1切点表达式

语法:execution([修饰符public等] 返回值类型 包名.类名.方法名(参数))
其中

  • 修饰符可省略
  • 返回值类型、包名.类名.方法名可以用 表示任意*
  • 包名与类名之间一个点.代表当前包下的类,两个点… 表示当前包及其其子包的类
  • 参数列表可以使用两个点…表示任意数量任意类型的参数列表
    比如
//不怎么常用,最简单
execution(public void com.demo.aop.impl.Target.Method())
//切入Target类中的含有任意参数的任意方法,即所有方法
execution( void com.demo.aop.impl.Target.*(..))
//切入aop包下所有类的所有方法,常用
execution(*  com.demo.aop.*.*(. .))
//切入aop包及其子包中的所有方法
execution(*  com.demo.aop. .*.*(. .))
execution(* *. .* .* (. .))
1.9.5.2.2 通知类型

语法:


其中aop标签下的method参数主要如下:

名称标签说明
前置通知< aop:before/>用于配置前置通知,指定增强方法在切入点方法执行前执行
后置通知< aop:after-retutnning/>用于配置后置通知,指定增强方法在切入点方法执行后执行
环绕通知< aop:around/>用于配置环绕通知,指定增强方法在切入点方法执行前后均执行
异常抛出通知< aop:after-throwing/>用于配置异常抛出通知,指定增强方法出现异常执行
最终通知< aop:after/>用于配置最终通知,指定增强方法是否有异常均执行
1.9.5.2.3 切点表达式的抽取

当多个切点表达式相同时,可以抽取它们,在增强中使用pointcut-ref来代替pointcut属性来引用抽取后的切点表达式

1.9.5.3 项目准备

根据SSM框架之Spring介绍开发流程/IDEA如何建立Spring项目搭建一个简单的项目并配置好所缺目录。

1.9.5.4 导入AOP相关坐标
  
	 org.springframework  
	 spring-context  
	 5.2.3.RELEASE  
  
  
	 org.aspectj  
	 aspectjweaver  
	 1.9.7  

1.9.5.5 创建目标接口和目标类

在java目录下新建接口及实现类,如图![[Pasted image 20211119153455.png]]

1.9.5.6 创建切面类

同样在AOP目录下新建切面类MyAspect,代码如下

public class MyAspect {  
		public void before1()  
		{  
			System.out.println("前置增强-----------");  
		 }  
		public void after()  
		{  
			System.out.println("最终通知增强-----------");  
	 	}  
		public void afterReturning()  
		{  
			System.out.println("后置增强-----------");  
		 }  
	//    proceedingJoinPoint:正在执行连接点==切点  
	 public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {  
			System.out.println("环绕前增强-----------");  
			 Object proceed = proceedingJoinPoint.proceed();  
			 System.out.println("环绕后增强-----------");  
			 return proceed;  
	 	}  
		public void throwing()  
		{  
			System.out.println("抛出异常增强-----------");  
	 	}  
}
1.9.5.7 创建配置文件并进行配置

在resources目录下新建applicationContext xml文件,并进行配置,代码如下:

  
  
  
	  
	   
	  
	   
	  
	   
	  
		   
          
		  
		   
		   
		   
		   
		 
		   
	  

1.9.5.8 测试

这里使用Spring集成Junit测试模块,新建测试类并导入相应的包,具体步骤见Spring集成Junit测试,测试类如图
最后出现如图结果即为成功,

1.9.6 注解开发AOP 1.9.6.1 步骤
  • 导入AOP相关坐标
  • 创建目标接口和目标类(内部有切点)
  • 创建切面类(内部有增强方法)
  • Spring接管目标类和切面类的对象创建权
  • 在切面类中使用注解配置织入关系
  • 配置文件中开启注解扫描和AOP自动代理
  • 测试代码
1.9.6.2 通知类型及切点表达式抽取

语法:@通知注解(切点表达式)
其中注解method参数主要如下:

名称标签说明
前置通知@Before用于配置前置通知,指定增强方法在切入点方法执行前执行
后置通知@AfterRetrunning用于配置后置通知,指定增强方法在切入点方法执行后执行
环绕通知@Around用于配置环绕通知,指定增强方法在切入点方法执行前后均执行
异常抛出通知@AfterThrowing用于配置异常抛出通知,指定增强方法出现异常执行
最终通知@After用于配置最终通知,指定增强方法是否有异常均执行

切点表达式抽取和XML开发AOP中的切点表达式差不多,不过在这里形式不一样,主要定义在切面类中,格式如下:

//格式
@Pointcut(value = "execution(* com.demo.annotation.*.*(..))")
//public void 方法名(){}
//举例
public void Pointcut(){}

//引用
 //主要有两种方法:
 //1. 直接切面类名.方法名
 @After(value = "MyAspect.Pointcut()")  
public void after()  
{  
    System.out.println("最终通知增强-----------");  
}

 //2.直接是方法名
 @AfterReturning(value = "Pointcut()")  
public void afterReturning()  
{  
    System.out.println("后置增强-----------");  
}
1.9.6.3 代码实现 1.9.6.2.1 项目准备

使用上一节 XML开发AOP中的项目,在demo目录下新建名为annotation的包,将aop包下的文件均复制进去,如图

1.9.6.2.2 注解配置
  • 在Target目标类上加入Bean注解,如图
  • 新建spring xml文件进行注解扫描和AOP自动代理配置,如图
  • 将测试类中的上下文改成如图
  • 在切面类中加入切面注解,代码如下:
@Component("myAspect")  
//标志当前类是一个切面类  
@Aspect  
public class MyAspect {  
		// 注解切点表达式抽取  
		 @Pointcut(value = "execution(* com.demo.annotation.*.*(..))")  
			public void Pointcut(){}
		@Before(value = "execution(* com.demo.annotation.*.*(..))")  
		public void before1()  
		{  
			System.out.println("前置增强-----------");  
	 	}  
		
//		引用抽取的切点表达式
		@After(value = "MyAspect.Pointcut()")
		public void after()  
		{  
			System.out.println("最终通知增强-----------");  
	 	}  
		
//		引用抽取的切点表达式
		@AfterReturning(value = "Pointcut()")
		public void afterReturning()  
		{  
			System.out.println("后置增强-----------");  
	 	}  
	//    proceedingJoinPoint:正在执行连接点==切点  
	 @Around(value = "execution(* com.demo.annotation.*.*(..))")  
		public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {  
			System.out.println("环绕前增强-----------");  
			 Object proceed = proceedingJoinPoint.proceed();  
			 System.out.println("环绕后增强-----------");  
			 return proceed;  
	 	}  
		@AfterThrowing(value = "execution(* com.demo.annotation.*.*(..))")  
		public void throwing()  
		{  
			System.out.println("抛出异常增强-----------");  
	 	}  
}
1.9.6.3 测试

运行结果如图,和XML配置结果一样!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/572153.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号