全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

深入理解spring的AOP机制原理

前言

在软件开发中,散布于应用中多处的功能被称为横切关注点,通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的。把这些横切关注点和业务逻辑分离出来正是AOP要解决的问题。AOP能够帮我们模块化横切关注点,换言之,横切关注点可以被描述为影响应用多出的功能。这些横切点被模块化特殊的类,这些类被称为切面。

术语定义

通知:切面有必须要完成的工作,在AOP中,切面的工作被称为通知。通知定义了切面是什么以及何时使用,除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题,它应该在某个方法之前?之后?之前和之后都调用?还是只在方法抛出异常时调用?

连接点:连接点是应用程序执行过程中,能够插入切面的一个点。

切点:是在连接点的基础上定义切点,比方说一个类由十几个方法,每个方法的调用前和调用后都可以插入通知,但是你只想选择几个方法插入通知,因此你定义一个切点来选择你想插入的通知的方法。

切面:切面就是通知和切点的结合。

织入:织入是把切面应用到目标对象并创建新的代理对象的过程,切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:编译期、类加载期、运行期。其中编译器织入需要特殊的编译器,类加载器织入需要特殊的类加载器,spring的AOP 是在运行期织入通知的。

Spring的AOP支持

spring提供了AOP的四种支持,分别是:基于代理的经典Spring AOP模式;纯POJO切面;@AspectJ注解驱动的切面;@注入式AspectJ切面。spring所创建的通知都是用标准的Java类编写的,而且定义通知所应用的切点通常会使用注解或在Spring配置文件里采用XML来编写。

spring只支持方法级别的连接点。

在spring AOP中,要使用AspectJ的切点表达式语言来定义切点,关于Spring AOP的AspectJ切点,最重要的一点就是Spring仅支持AspectJ切点指示器的一个子集:

1.arg() 限制连接点匹配参数为指定类型的执行方法;
2.@args() 限制连接点匹配参数由指定注解标注的执行方法;
3.execution() 用于匹配是连接点的执行方法;
4.this() 限制连接点匹配AOP代理的bean引用为指定类型的类
5.target 限制连接点匹配目标对象为指定类型的类
6.@target() 限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注解
7.within() 限制连接点匹配指定的类型
8.@within() 限制连接点匹配特定注解所标注的类型
9.@annotation 限定匹配带有指定注解的连接点

spring 注解创建切面

目标对象:

package concert;
public interface Performance{
  public void perform();
}

切面对象:

package concert;

@Aspect//表示Audience的实例是一个切面
public class Audience{
  @Before("execution(**concert.Performance.perform(..))")
  public void silenceCellPhones(){
  //在perfrom方法执行之前
  }
  @Before("execution(**concert.Performance.perform(..))")
  public void takeSeats(){
  //在perfrom方法执行之前
  }
  @AfterReturning("execution(**concert.Performance.perform(..))")
  public void silenceCellPhones(){
  //在perfrom方法执行之后
  }
  @AfterThrowing("execution(**concert.Performance.perform(..))")
  public void silenceCellPhones(){
  //在perfrom方法抛出异常之后
  }
}

上面的类中切点表达式execution(**concert.Performance.perform(..))多次出现,我们也可以通过@Pointcut注解避免每次都写很长的切点表但是如下所示:

@Aspect//表示Audience的实例是一个切面
public class Audience{
  @Pointcut("execution(**concert.Performance.perform(..))")
  public void performance(){}
  @Before("performance()")
  public void silenceCellPhones(){
  //在perfrom方法执行之前
  }
  @Before("performance()")
  public void takeSeats(){
  //在perfrom方法执行之前
  }
  @AfterReturning("performance()")
  public void silenceCellPhones(){
  //在perfrom方法执行之后
  }
  @AfterThrowing("performance()")
  public void silenceCellPhones(){
  //在perfrom方法抛出异常之后
  }
}

接下来需要在配置文件中配置切面如下所示:

@Configuration
@EnableAspectJAutoProxy//启动AspectJ自动代理
@ComponentScan
public class ConcertConfig{
}
//或者在配置文件中配置中添加
<aop:aspectj-autoproxy />

表示启动切面代理

环绕通知:

@Aspect//表示Audience的实例是一个切面
public class Audience{
  @Pointcut("execution(**concert.Performance.perform(..))")
  public void performance(){}
  
  @Before("performance()")
  public void watchPerformance(ProceedingJoinPoint jp){
    //在方法之前执行
    System.out.println(" beform the method is invoked");
    jp.proceed()//控制权交给目标方法
    //在方法之后执行
    System.out.println(" after the method is invoked");
  }
  
}

处理通知中的参数

public class Audience{
  @Pointcut("execution(**concert.Performance.perform(int))&&args(trackNumber)")
  public void performance(){}
  
  @Before("performance(trackNumber)")
  public void watchPerformance(int trackNumber){
    //截获传递给目标方法的参数并传递给切面中处理方法
    System.out.println(trackNumber);
  }
  
}

xml中声明切面

spring AOP提供的xml配置元素:

1.<aop:advisor> 定义AOP通知;
2.<aop:after> 后置通知;
3.<aop:after-returning> 返回通知
4.<aop:around> 环绕通知
5.<aop:aspect> 定义一个切面
6.<aop:aspectj-autoproxy> 启用切面注解驱动
7.<aop:before> 前置通知
8.<aop:config> 顶层的AOP配置元素;
9.<aop:pointcut>:定义个切点

<aop:config>
  <aop:aspect ref="audience">
    <aop:before
     pointcut="execution(**concert.Performance.perform())" method="silenceCellPhones"/>
     <aop:before
     pointcut="execution(**concert.Performance.perform())" method="takeSeats"/>
     <aop:after-returning
     pointcut="execution(**concert.Performance.perform())" method="applause"/>
     <aop:after-throwing
     pointcut="execution(**concert.Performance.perform())" method="demandRefund"/>

  </aop:aspect>
</aop config>

定义切点:

<aop:config>
  <aop:aspect ref="audience">
    <aop:pointcut id="performance" expression="execution(**concert.Performance.perform())">
    <aop:before
     pointcut-ref="performance" method="silenceCellPhones"/>
     <aop:before
     pointcut="performance" method="takeSeats"/>
     <aop:after-returning
     pointcut="performance" method="applause"/>
     <aop:after-throwing
     pointcut="performance" method="demandRefund"/>

  </aop:aspect>
</aop config>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring的AOP机制  # spring  # aop原理  # aop实现方式  # Spring AOP中使用args表达式的方法示例  # 通过实例解析Spring argNames属性  # Spring AOP的使用详解  # 浅谈Spring AOP中args()和argNames的含义  # 是一个  # 横切  # 被称为  # 抛出  # 是在  # 配置文件  # 加载  # 所示  # 都是  # 几个  # 多个  # 基础上  # 最重要  # 你想  # 可以通过  # 只想  # 很长  # 只在  # 四种  # 多出 


相关文章: 深圳网站制作平台,深圳市做网站好的公司有哪些?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  如何用腾讯建站主机快速创建免费网站?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  如何在阿里云购买域名并搭建网站?  名字制作网站免费,所有小说网站的名字?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  测试制作网站有哪些,测试性取向的权威测试或者网站?  成都网站制作报价公司,成都工业用气开户费用?  如何高效生成建站之星成品网站源码?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  建站主机功能解析:服务器选择与快速搭建指南  动图在线制作网站有哪些,滑动动图图集怎么做?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  小建面朝正北,A点实际方位是否存在偏差?  黑客入侵网站服务器的常见手法有哪些?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  如何用狗爹虚拟主机快速搭建网站?  广德云建站网站建设方案与建站流程优化指南  建站之星多图banner生成与模板自定义指南  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  如何通过宝塔面板实现本地网站访问?  如何快速生成凡客建站的专业级图册?  建站之星北京办公室:智能建站系统与小程序生成方案解析  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  实例解析angularjs的filter过滤器  建站之星免费版是否永久可用?  制作旅游网站html,怎样注册旅游网站?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  Swift中switch语句区间和元组模式匹配  模具网站制作流程,如何找模具客户?  常州自助建站费用包含哪些项目?  建站之星3.0如何解决常见操作问题?  建站主机与虚拟主机有何区别?如何选择最优方案?  网站制作公司,橙子建站是合法的吗?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  广州建站公司哪家好?十大优质服务商推荐  北京网站制作的公司有哪些,北京白云观官方网站?  建站主机如何安装配置?新手必看操作指南  网页设计与网站制作内容,怎样注册网站?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  如何在七牛云存储上搭建网站并设置自定义域名?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。