浅识Spring AOP

简介: 浅识Spring AOP

Spring AOP


引言(just I think): 因为java是面向对象编程,而面向对象是纵向继承机制,无法集中注意力到核心代码中,所以我们需要调用其他的机制来解决非核心代码的包装,将其从核心代码块中解耦出来


首先我们从spring官网了解一下他们对AOP思想的介绍


官网地址:docs.spring.io/spring-fram…


面向方面编程 (AOP) 通过提供另一种思考程序结构的方式来补充面向对象编程 (OOP)。OOP 中模块化的关键单元是类,而在 AOP 中,模块化的单元是方面 。方面使关注点模块化,例如跨越多种类型和对象的事务管理。(此类关注点在 AOP 文献中通常称为横切关注点。)


Spring 的关键组件之一是AOP 框架。虽然 Spring IoC 容器不依赖于 AOP,这意味着您不需要使用 AOP,但 AOP 补充了 Spring IoC 以提供非常强大的中间件解决方案。


具体概念


***AOP(Aspect Oriented Programming)是一种设计思想,是软件设计领域中的面向切面编程,它是面 向对象编程的一种补充和完善,它以通过预编译方式和运行期动态代理方式实现在不修改源代码的情况 下给程序动态统一添加额外功能的一种技术  。***


AOP的相关相关术语:


横切关注点


就是从每个核心方法中抽取出来的非核心代码(既非核心业务逻辑),最后放入一个类中(这个类叫切面),不同的业务逻辑实现不同的方法


这个概念不是语法层面天然存在的,而是根据附加功能(核心方法中的非核心代码)的逻辑上的需要:有十个附加功能(核心方法中的非核心代码),就有十个横切关注点。

 

通知


简单地说就是在切面中,非核心业务也就是我们需要做的事,被封装成为一个方法(该方法叫通知)—-通知就是横切关注点的实现。


1.切面

封装横切关注点或者说是通知的类


1.目标

被代理的目标对象


1.代理

向目标对象应用通知之后创建的代理对象(不需要我们自己创建,封装的就是)AOP帮助我们创建


1.连接点

这也是一个纯逻辑概念,不是语法定义的。 把方法排成一排,每一个横切位置看成x轴方向,把方法从上到下执行的顺序看成y轴,x轴和y轴的交叉 点就是连接点


从哪里套出来的就放回哪里,不改变元代码的逻辑


1.切入点

定位连接点的方式(位置)。


作用

  • 简化代码: 把方法中固定位置的重复的代码抽取出来,让被抽取的方法更专注于自己的核心功能, 提高内聚性。
  • 代码增强: 把特定的功能封装到切面类中,看哪里有需要,就往上套,被套用了切面逻辑的方法就 被切面给增强了。


基于注解的AOP


技术说明:


几种动态代理


  • 动态代理(InvocationHandler):JDK原生的实现方式,需要被代理的目标类必须实现接口。因 为这个技术要求代理对象和目标对象实现同样的接口(兄弟两个拜把子模式)。
  • cglib:通过继承被代理的目标类(认干爹模式)实现代理,所以不需要目标类实现接口。
  • AspectJ:本质上是静态代理,将代理逻辑“织入”被代理的目标类编译得到的字节码文件,所以最 终效果是动态的。weaver就是织入器。Spring只是借用了AspectJ中的注解。


通过阅读官方文档我们可以知道 :


Spring AOP 默认使用标准的 J2SE* 动态代理* 作为 AOP 代理。这使得任何接口(或接口集)都可以被代理。


启用AOP顺序


  1. 将目标对象和切面交给IOC容器管理(注解+扫描)
  2. 将切面类和目标类作为容器中的组件,所以加@Component
  3. 将当前组件用@Aspect注解标注为切面
  4. 开启基于注解的aop ( 开启AspectJ的自动代理,为目标对象自动生成代理 )

<!--    作用: 开启基于注解的aop-->
    <aop:aspectj-autoproxy/>

1.配置好切入点表达式 :

声明一个方法,然后使用@Poincut注解来进行声明公共的切入点表达式 可)


/**
     * 切入点表达式的重用******重点
     */
//    execution(权限修饰符 返回值 项目. 包/ *  . 类/ * .方法 (..) )
    @Pointcut("execution(* com_Ray.such.*.*(..))")
    public void pointCut(){}


AOP的各种通知详解


各种通知的执行顺序:


Spring版本5.3.x以前:

前置通知 -->目标操作--> 后置通知--> 返回通知 / 异常通知

Spring版本5.3.x以后:

前置通知--> 目标操作--> 返回通知 / 异常通知--> 后置通知


1.前置语法:

使用@Before注解标识,在被代理的目标方法前执行


@Before("pointCut()")
    public void beforeAdviceMethod(JoinPoint joinPoint){
        //1. 获取连接点所对应方法的方法名
        Signature signature = joinPoint.getSignature();
        //2.  获取连接点所对应方法的参数
        Object[] args = joinPoint.getArgs();
        System.out.println("方法名为: " + signature.getName()+ ",参数为: " + Arrays.toString(args));
//        System.out.println("前置通知!");
    }
joinPoint 作为前置通知的方法的参数 ,可以获取连接点多对应的方法的签名信息()


1.后置语法

注解 :@After(“point Cut()”)在方法执行之后的finally中执行


返回通知

注解: @AfterReturn(“point Cut()“) 在目标对象执行之后执行

/**
 * 返回通知!
 * 在目标方法返回值之后的一个通知
 */
@AfterReturning("pointCut()")
public void afterReturn(JoinPoint joinPoint){
    Signature signature = joinPoint.getSignature();
    System.out.println("方法: " + signature.getName()+"执行返回通知");
}


1.异常通知

/**
 * 异常通知
 */
@AfterThrowing(value = "pointCut()",throwing = "ex")
public void AfterThrow(JoinPoint joinPoint, Throwable ex){
    Signature signature = joinPoint.getSignature();
    System.out.println("方法: " + signature.getName()+"的异常通知:" + ex);
}


1.环绕通知---@Around( )

设置环绕通知之后就可以将所有前面的通知都涵盖进去


基于XML的AOP



其基本与基于注解实现一样


配置xml环境


<context:component-scan base-package="com.atguigu.aop.xml"></context:componentscan>
<aop:config>
<!--配置切面类-->
<aop:aspect ref="loggerAspect">
    <aop:pointcut id="pointCut" expression="execution(*
com.atguigu.aop.xml.CalculatorImpl.*(..))"/>
    <aop:before method="beforeMethod" pointcut-ref="pointCut"></aop:before>
    <aop:after method="afterMethod" pointcut-ref="pointCut"></aop:after>
    <aop:after-returning method="afterReturningMethod" returning="result"
                         pointcut-ref="pointCut"></aop:after-returning>
    <aop:after-throwing method="afterThrowingMethod" throwing="ex" pointcutref="pointCut"></aop:after-throwing>
    <aop:around method="aroundMethod" pointcut-ref="pointCut"></aop:around>
</aop:aspect>
<aop:aspect ref="validateAspect" order="1">
    <aop:before method="validateBeforeMethod" pointcut-ref="pointCut">
    </aop:before>
</aop:aspect>
</aop:config>


目录
相关文章
|
4天前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
1月前
|
Java Spring
在Spring Boot中使用AOP实现日志切面
在Spring Boot中使用AOP实现日志切面
|
4天前
|
XML Java 数据格式
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
这篇文章是Spring5框架的AOP切面编程教程,通过XML配置方式,详细讲解了如何创建被增强类和增强类,如何在Spring配置文件中定义切入点和切面,以及如何将增强逻辑应用到具体方法上。文章通过具体的代码示例和测试结果,展示了使用XML配置实现AOP的过程,并强调了虽然注解开发更为便捷,但掌握XML配置也是非常重要的。
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
|
7天前
|
安全 Java 开发者
Java 新手入门:Spring 两大利器IoC 和 AOP,小白也能轻松理解!
Java 新手入门:Spring 两大利器IoC 和 AOP,小白也能轻松理解!
14 1
|
7天前
|
Java Spring
Spring的AOP组件详解
该文章主要介绍了Spring AOP(面向切面编程)组件的实现原理,包括Spring AOP的基础概念、动态代理模式、AOP组件的实现以及Spring选择JDK动态代理或CGLIB动态代理的依据。
Spring的AOP组件详解
|
19天前
|
Java API Spring
Spring Boot 中的 AOP 处理
对 Spring Boot 中的切面 AOP 做了详细的讲解,主要介绍了 Spring Boot 中 AOP 的引入,常用注解的使用,参数的使用,以及常用 api 的介绍。AOP 在实际项目中很有用,对切面方法执行前后都可以根据具体的业务,做相应的预处理或者增强处理,同时也可以用作异常捕获处理,可以根据具体业务场景,合理去使用 AOP。
|
28天前
|
Java Spring 容器
Spring问题之Spring AOP是如何实现面向切面编程的
Spring问题之Spring AOP是如何实现面向切面编程的
|
24天前
|
缓存 安全 Java
Spring高手之路21——深入剖析Spring AOP代理对象的创建
本文详细介绍了Spring AOP代理对象的创建过程,分为三个核心步骤:判断是否增强、匹配增强器和创建代理对象。通过源码分析和时序图展示,深入剖析了Spring AOP的工作原理,帮助读者全面理解Spring AOP代理对象的生成机制及其实现细节。
17 0
Spring高手之路21——深入剖析Spring AOP代理对象的创建
|
4天前
|
XML Java 数据库
Spring5入门到实战------10、操作术语解释--Aspectj注解开发实例。AOP切面编程的实际应用
这篇文章是Spring5框架的实战教程,详细解释了AOP的关键术语,包括连接点、切入点、通知、切面,并展示了如何使用AspectJ注解来开发AOP实例,包括切入点表达式的编写、增强方法的配置、代理对象的创建和优先级设置,以及如何通过注解方式实现完全的AOP配置。
|
1月前
|
Java Spring
在Spring Boot中使用AOP实现日志切面
在Spring Boot中使用AOP实现日志切面