Spring AOP的几种实现方式总结

AOP核心概念

1、横切关注点

对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点

2、切面(aspect)

类是对物体特征的抽象,切面就是对横切关注点的抽象

3、连接点(joinpoint)

被拦截到的点,因为spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器

4、切入点(pointcut)

对连接点进行拦截的定义

5、通知(advice)

所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类

6、目标对象

代理的目标对象

7、织入(weave)

将切面应用到目标对象并导致代理对象创建的过程

8、引入(introduction)

在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段

Spring 实现AOP所需要的包:

1、Spring提供的jar包

2、aopalliance.jar

3、aspectjweaver.jar

Spring 实现AOP的方式:

1、Java动态代理

该方法针对接口的实例创建代理

applicationContext.xml的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"> 

    <bean id="concreteImplementor" class="com.marving.aop.ConcreteImplementor" /> 

    <bean id="interceptorHandler" class="com.marving.aop.InterceptorHandler" /> 

    <aop:config>
      <aop:aspect id="interceptor" ref="interceptorHandler">
        <aop:pointcut id="addAllMethod" expression="execution(* com.marving.aop.Abstration.*(..))" />
        <aop:before method="doSomething" pointcut-ref="addAllMethod" />
        <aop:after method="doSomething" pointcut-ref="addAllMethod" />
      </aop:aspect>
    </aop:config>
</beans> 

其中Abstration为接口,ConcreteImplementor为实现类,InterceptorHandler为代理拦截类。

public interface <span style="font-size:12px;">Abstration</span> {
  public void operation()
} 
//具体实现化角色
public class ConcreteImplementor implements Implementor{ 

  @Override
  public void operation() {
    System.out.println("ConcreteImplementor");
  } 

} 
public class InterceptorHandler{
  public void printTime(){
    System.out.println("CurrentTime = " + System.currentTimeMillis());
  }
} 

2、CGLIB生成代理

CGLIB针对代理对象为类的情况使用。

通过实现MethodInterceptor接口,并实现 public Object intercept(Object obj, Method m, Object[] args,MethodProxy proxy) throws Throwable方法生成代理。

3、BeanNameAutoProxyCreator实现AOP

Spring为我们提供了自动代理机制,让容器为我们自动生成代理,把我们从烦琐的配置工作中解放出来,在内部,Spring 使用BeanPostProcessor自动地完成这项工作。

具体配置如下:

<bean id="MyInterceptor" class="com.yesjpt.interceptor. MyInterceptor"></bean>
<bean
  class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  <property name="beanNames">
    <list>
      <value>*Service</value>
    </list>
  </property>
  <property name="interceptorNames">
    <list>
      <value>MyInterceptor</value>
    </list>
  </property>
 </bean>

其中*Service 为需要拦截代理的bean,以Service结尾的都 被拦截,并使用MyInterceptor 进行拦截,可配置多个拦截器,按顺序执行。

import java.lang.reflect.Method;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/**
 * @author
 *
 */
public class MyInterceptor implements MethodInterceptor{  

  @Override
  public Object invoke(MethodInvocation invocation) throws Throwable {  

    Method method = invocation.getMethod();//获取被拦截的方法
    Object[] arguments = invocation.getArguments();//获取拦截方法的参数
    /*
     * 特殊,某些权限需要做特殊处理
     * 比如用户信息权限,在方法执行完毕返回的时候,要将电话号码与邮箱抹除
     */
    //环绕通知前置特殊处理
    this.beforeReslove();
    Object proceed = invocation.proceed();//调用目标方法
    //环绕通知后置特殊处理
    proceed = this.afterReslove();
    return proceed;
  }
   private Object afterReslove() {
      System.out.println("CurrentTime = " + System.currentTimeMillis());
     return null;
   }
   private void beforeReslove() {
      System.out.println("CurrentTime = " + System.currentTimeMillis());
   }
}

4、使用注解AspectJ实现AOP

ApplicationContext.xml 加入

<aop:aspectj-autoproxy/> 

创建切面处理类

package com.marving.aop;
import java.util.Arrays;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class AspectHandler { 

  @Pointcut("execution(* com.marving.service.BaseServ+.*(..))")
  private void doMethod() {
  } 

    /**
   * This is the method which I would like to execute before a selected method
   * execution.
   */
  @Before("doMethod()")
  public void beforeAdvice() {
    System.out.println("before method invoked.");
  } 

  /**
   * This is the method which I would like to execute after a selected method
   * execution.
   */
  @After("doMethod()")
  public void afterAdvice() {
    System.out.println("after method invoked.");
  } 

  // 配置controller环绕通知,使用在方法aspect()上注册的切入点
  @Around("doMethod()")
  public Object around(ProceedingJoinPoint pjp) throws Throwable{
    Object result = null;
    String methodName = pjp.getSignature().getName();
    try {
      System.out.println("The method [" + methodName + "] begins with " + Arrays.asList(pjp.getArgs()));
      result = pjp.proceed();
    } catch (Throwable e) {
      System.out.println("The method [" + methodName + "] occurs expection : " + e);
      throw new RuntimeException(e);
    }
    System.out.println("The method [" + methodName + "] ends");
    return result;
  }
}

通过表达式execution(* com.marving.service.BaseServ+.*(..)) 匹配切入点函数,并使用@Before@After@Around 对所拦截方法执行前、中、后进行拦截并执行处理函数。

@Around @Before @After三个注解的区别@Before是在所拦截方法执行之前执行一段逻辑。@After 是在所拦截方法执行之后执行一段逻辑。@Around是可以同时在所拦截方法的前后执行一段逻辑。

值得注意的是,Around在拦截方法后,需要返回一个方法执行结果,否则,原方法不能正常执行。

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

(0)

相关推荐

  • spring中AOP 注解开发示例详解

    一.简介 AOP主要包含了通知.切点和连接点等术语,介绍如下: 通知(advice) 通知定义了切面是什么以及何时调用,何时调用包含以下几种 Before 在方法被调用之前调用通知 After 在方法完成之后调用通知,无论方法执行是否成功 After-returning 在方法成功执行之后调用通知 After-throwing 在方法抛出异常后调用通知 Around 通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为 切点(PointCut) 通知定义了切面的什么和何时,切

  • spring aop 拦截业务方法,实现权限控制示例

    难点:aop类是普通的java类,session是无法注入的,那么在有状态的系统中如何获取用户相关信息呢,session是必经之路啊,获取session就变的很重要.思索很久没有办法,后来在网上看到了解决办法. 思路是: i. SysContext  成员变量 request,session,response ii. Filter 目的是给 SysContext 中的成员赋值 iii.然后在AOP中使用这个SysContext的值 要用好,需要理解  ThreadLocal和  和Filter

  • 详解spring面向切面aop拦截器

    spring中有很多概念和名词,其中有一些名字不同,但是从功能上来看总感觉是那么的相似,比如过滤器.拦截器.aop等. 过滤器filter.spring mvc拦截器Interceptor .面向切面编程aop,实际上都具有一定的拦截作用,都是拦截住某一个面,然后进行一定的处理. 在这里主要想着手的是aop,至于他们的比较,我想等三个都一一了解完了再说,因此这里便不做过多的比较. 在我目前的项目实践中,只在一个地方手动显示的使用了aop,那便是日志管理中对部分重要操作的记录. 据我目前所知,ao

  • java基于spring注解AOP的异常处理的方法

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...finally对异常进行处理,但是我们真的能在写程序的时候处理掉所有可能发生的异常吗? 以及发生异常的时候执行什么逻辑,返回什么提示信息,跳转到什么页面,这些都是要考虑到的. 二.基于@ControllerAdvice(加强的控制器)的异常处理 @ControllerAdvice注解内部使用@Except

  • 详解Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过. 什么是 AOP ? AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生

  • Spring AOP 基于注解详解及实例代码

    Spring AOP  基于注解详解及实例代码 1.启用spring对@AspectJ注解的支持: <beans xmlns:aop="http://www.springframework.org/schema/aop"...> <!--启动支持--> <aop:aspectj-autoproxy /> </beans> 也可以配置AnnotationAwareAspectJAutoProxyCreator Bean来启动Spring对@

  • spring boot如何使用spring AOP实现拦截器

    在spring boot中,简单几步,使用spring AOP实现一个拦截器: 1.引入依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 2.创建拦截器类(在该类中,定义了拦截规则:拦截com.xjj.web.controller包下面的所

  • Java之Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就算这样,但你肯定也会有后台管理及登录功能. 每个项目中都会有这些几乎一样的业务逻辑,我们能不能把他们做成通用的系统呢? AOP 实现用户权限验证 AOP 在实际项目中运用的场景主要有权限管理(Authority Management).事务管理(Transaction Management).安全管

  • Spring AOP的五种通知方式代码实例

    这篇文章主要介绍了Spring AOP的五种通知方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 AOP的五种通知方式: 前置通知:在我们执行目标方法之前运行(@Before) 后置通知:在我们目标方法运行结束之后,不管有没有异常(@After) 返回通知:在我们的目标方法正常返回值后运行(@AfterReturning) 异常通知:在我们的目标方法出现异常后运行(@AfterThrowing) 环绕通知:目标方法的调用由环绕通知决定

  • Spring AOP的几种实现方式总结

    AOP核心概念 1.横切关注点 对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点 2.切面(aspect) 类是对物体特征的抽象,切面就是对横切关注点的抽象 3.连接点(joinpoint) 被拦截到的点,因为spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器 4.切入点(pointcut) 对连接点进行拦截的定义 5.通知(advice) 所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置.后置.异常

  • Spring  AOP的两种使用方法

    目录 前言 1 注解方式 1.1 声明目标类 UserDao 类 1.2 声明切面 AnnotationAspect 类 1.3 声明配置 1.4 测试用例 2 XML 配置方式 2.1 声明目标类 CompanyDao 2.2 声明切面拦截类 XmlAspect 2.3 声明 XML 配置 2.3 测试用例 前言 记录下 Spring AOP 的两种使用方式,不谈概念,只记录两种方式的使用例子 注解方式 xml 配置方式 1 注解方式 1.1 声明目标类 UserDao 类 @Reposito

  • Spring AOP拦截-三种方式实现自动代理详解

    这里的自动代理,我讲的是自动代理bean对象,其实就是在xml中让我们不用配置代理工厂,也就是不用配置class为org.springframework.aop.framework.ProxyFactoryBean的bean. 总结了一下自己目前所学的知识. 发现有三种方式实现自动代理 用Spring一个自动代理类DefaultAdvisorAutoProxyCreator: <bean class="org.springframework.aop.framework.autoproxy.

  • 猜你不知道Spring Boot的几种部署方式(小结)

    引言 本文主要讲的是spring boot的五种部署方式,里面是否有你不知道的呢,如果有欢迎评论留言哦,一起交流探讨哦!!! 可以使用各种方法将Spring Boot应用程序部署到生产系统中.在本文中,我们将通过以下5种方法逐步部署Spring Boot应用程序: 在Java Archive(JAR)中作为独立应用程序进行部署, 将Web应用程序存档(WAR)部署到servlet容器中, 在Docker Container中部署, 在NGINX Web服务器后面部署 - 直接设置, 部署在NGI

  • Spring AOP 后置处理器使用方式

    目录 1 前言 2 BeanPostProcesser 后置处理器 3 总结 1 前言 在 Spring 的体系中,在前文中已经讲述了IOC 容器以及 Bean的理解,在本文基于之前文章内容将继续 AOP 的源码分享. AOP 是一个很繁杂的知识点,这里先从后置处理器开始. 2 BeanPostProcesser 后置处理器 BeanPostProcesser 在 Spring 是一个很重要的概念,这是容器提供的一个可扩展接口,关于后置处理器 Spring 给出的注释是这样的: 简单来说就是:

  • 基于spring DI的三种注入方式分析

    一.前言: IOC(控制反转)与DI(依赖注入) Spring框架对Java开发的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反转)和AOP,平时使用最多的就是其中的IOC,我们通过将组件交由Spring的IOC容器管理,将对象的依赖关系由Spring控制,避免硬编码所造成的过度程序耦合. 在讲依赖注入之前,我觉得有必要了解一下IOC(控制反转)与DI(依赖注入)的关系,在这篇文章中有详细的介绍:spring IOC 与 DI. 二.DI的三种常见注入方

  • 浅谈spring aop的五种通知类型

    spring aop通知(advice)分成五类:  前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常. 正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行. 异常返回通知[After throwing advice]:在连接点抛出异常后执行. 返回通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回

  • JAVA中 Spring定时器的两种实现方式

    目前有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz. 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; public class EmailReportTask extends TimerTask{ @Override public void run() { ... } } 在Spring定义 ... 配置Spring定时器 <bean id=&quo

  • Spring AOP 与代理的概念与使用

    一.AOP 的基本概念 1.1 什么是 AOP Aspect Oriented Programming,面向切面编程. 就跟我们说 OOP 是面向对象一样,AOP 是面向切面的.切面是分散在应用中的一个标准代码或功能.切面通常与实际的业务逻辑不同(例如,事务管理).每个切面专注于一个特定的环切功能. 这里的切面呢,可以理解为横切.比如在所有的 DAO 层方法上加上一个同样的切面,功能是记录日志:又或者在某个接口上应用一个切面,作用是检查权限. AOP 是基于代理来实现的.而代理又分为静态代理和动

随机推荐