Spring 面向切面编程AOP实现详解

网友投稿 455 2022-12-28


Spring 面向切面编程AOP实现详解

简介

1、什么叫做面向切面编程?

概念:把一个个的横切关注点(某种业务的实现代码)放到某个模块中去,称之为切面。每个切面影响业务的一种功能,切面的目的就是为了功能增强,将需要增强的方法做成切面,实现对业务的增强,就是面向切面编程。

目的:将与业务本身无关,却被业务模块所共同调用的功能代码封装成切面,以减少系统的重复代码,降低耦合,提高可扩展性。

优势:把多个方法前/后的共同代码抽离出来,使用动态代理机制来控制,先执行抽离出来的代码,再执行每一个真实方法.

2、Spring中的AOP使用动态代理来实现:

如果一个类实现了接口,那么spring就使用JDK的动态代理完成AOP;

  如果一个类没有实现接口,那么spring就是用cglib完成AOP。

3、AOP的一些基本概念

Joinpoint:连接点,被拦截到需要被增强的方法。去哪里做增强

  Pointcut:切入点,哪些包中的哪些类中的哪些方法,可认为是连接点的集合。去哪些地方做增强

  Advice:增强,当拦截到Joinpoint之后,在方法执行的什么时机(when)做什么样(what)的增强。

  Aspect:切面,Pointcut+Advice,去哪些地方+在什么时候+做什么增强

  Weaving:织入,把Advice加到Target上之后,创建出Proxy对象的过程。

切入点语法

1、execution(<访问修饰符>?<返回值类型><声明类型>?<方法名>(<参数名>)<异常名>)

?表示出现0次或1次

通配符:

* :匹配任何部分,只能表示一个单词

.. : 可用于全限定名中和方法参数中,分别表示子包和0到N个参数

2、实例介绍:

XML方式实现AOP

1、导入依赖

spring-aop  spring-aspectj

2、命名空间

xmlns:aop="http://springframework.org/schema/aop"

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/aop

http://springframework.org/schema/aop/spring-aop.xsd

">

xmlns:aop="http://springframework.org/schema/aop"

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/aop

http://springframework.org/schema/aop/spring-aop.xsd

">

3、配置AOP

4、AOP中几个不同的增强时机:

aop:before(前置增强):在方法执行之前执行增强;

  aop:after-returning(后置增强):在方法正常执行完成之后执行增强;

  aop:after-throwing(异常增强):在方法抛出异常退出时执行增强;

  aop:after(最终增强):在方法执行之后执行,相当于在finally里面执行;可以通过配置throwing来获得拦截到的异常信息

  aop:around(环绕增强):最强大的一种增强类型。

环绕增强可以在方法调用前后完成自定义的行为,环绕增强有两个要求

1、方法要返回一个Object(返回的结果)

2、方法的第一个参数是ProceedingJoinPoint(可以继续向下传递的切入点)

5、代码示例

public class TxManager {

public void begin() {

System.out.println("开启事务###");

}

public void commit() {

System.out.println("提交事务++++++");

}

public void roWmvuQJOmllback() {

System.out.println("回滚事务....");

}

public void destroy() {

System.out.println("释放资源……………………");

}

//环绕增强代码示例

public Object around(ProceedingJoinPoint pjp){

Object obj=null;

try {

System.out.println("开启事务###");

obj=pjp.proceed();

System.out.println("提交事务++++++");

} catch (Throwable throwable) {

throwable.printStackTrace();

System.out.println("回滚事务....");

}finally {

System.out.println("释放资源……………………");

}

return obj;

}

}

6、获取增强的参数

1.在增强方法中获取异常的信息。

的标签中添加throwing=“ex”的属性

增强方法rollback中,添加形式参数:Exception ex。

则形参ex中就自动注入了异常对象。 注意:throwing属性的值,必须与方法中形参的名字相同

2.在增强方法中,获取被增强方法的信息

Spring AOP提供org.aspectj.lang.JoinPoint类作为增强方法的第一个参数。

JoinPoint :提供访问当前被增强方法的真实对象、代理对象、方法参数等数据。

ProceedingJoinPoint:JinPoint子类,只用于环绕增强中,可以处理被增强方法。

jp.getThis():获取代理对象

   jp.getTarget():获取目标对象

   jp.getArgs():获取被增强方法的参数

   jp.getSignature():获取被增强方法的参数

注解方式实现AOP

1、命名空间

2、添加注解解析器

3、@Aspect 切面,下面的注解都在切面里配置

@before

  @AfterReturning

  @AfterThrowing

  @After

  @Around

4、代码示例

@Aspect

public class TxManager {

@Pointcut("execution( * com.test.class04_AOP_Anno.service.IUserService.*(..))")

public void tt(){}

@Before("tt()")

public void begin() {

System.out.println("开启事务###");

}

@AfterReturning("tt()")

public void commit() {

System.out.println("提交事务++++++");

}

@AfterThrowing(value="tt()",throwing = "ex")

public void rollback() {

System.out.println("回滚事务....");

}

@After("tt()")

public void destroy() {

System.out.println("释放资源……………………");

}

@Around("tt()")

public Object around(ProceedingJoinPoint pjp){

Object obj=null;

try {

System.out.println("开启事务###");

obj=pjp.proceed();

System.out.println("提交事务++++++");

} catch (Throwable throwable) {

throwable.printStackTrace();

System.out.println("回滚事务....");

}finally {

System.out.println("释放资源……………………");

}

return obj;

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:用nginx做微服务网关(nginx可以作为网关吗)
下一篇:文件下载接口测试工具(接口在线测试工具)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~