spring 详解六 AOP

这篇具有很好参考价值的文章主要介绍了spring 详解六 AOP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AOP概念

AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华,OOP是纵向对事物的抽象,一个对象包含属性信息和动态的方法信息等,而AOP是横向对不同事物的抽象,属性与属性、方法与方法、对象与对象都可以组成一个切面,而这种思想叫做界面编程

相关核心概念

名称       说明
Target 目标对象,被增强方法所在的对象
proxy 增强后的代理对象,实际调用的对象
joinpoint 目标对象中可以被增强的方法
pointcut 目标对象中实际被增强的方法
advice 增强部分代码逻辑 就是通知
Aspect 增强部分和切入点的组合
weaving         将通知和切入点动态组合的过程

通知分类

通知         说明
before(前置通知) 在切点方法之前执行增强方法
after(后置通知) 在切点方法执行之后执行增强方法
after-returning(返回后通知) 在切点方法返回之后执行增强方法
after-throwing(抛出异常通知) 在切点方法抛出异常之后执行增强方法
around(环绕通知) 通知方法封装切点方法环绕执行

Spring AOP两种使用方式

使用Spring自带的AOP

配置通知时需实现org.springframework.aop包下的一些接口

  • 前置通知:MethodBeforeAdvice
  • 后置通知:AfterReturningAdvice
  • 环绕通知:MethodInterceptor
  • 异常通知:ThrowsAdvice
public class LogAdvice implements MethodBeforeAdvice, AfterReturningAdvice,MethodInterceptor {
 
    @Override
 
    public void before(Method method, Object[] objects, Object target) throws Throwable {
 
        //前置通知
 
    }
 
 
 
    @Override
 
    public void afterReturning(Object result, Method method, Object[] objects, Object target) throws Throwable {
 
        //后置通知
 
    }
 
     @Override
 
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
 
        //环绕通知
 
        //目标方法之前执行
 
        methodInvocation.proceed();   //目标方法
 
 
 
        //目标方法之后执行
 
        return resultVal;
 
    }
 
}

 <bean id="userServiceBean" class="com.apesource.service.impl.UserServiceImpl"/>

 <bean id="logAdviceBean" class="com.apesource.log.LogAdvice"/>
 
<bean id="createMethodPointcutBean"     class="org.springframework.aop.support.JdkRegexpMethodPointcut">
 
    <!--注入正则表达式:描述那些方法为切入点-->
 
    <property name="pattern" value=".*creat.*"/>
 
</bean>

Advisor

Advisor(高级通知) = Advice(通知) + Pointcut(切入点)

<bean id="performanceAdvisorBean" class="org.springframework.aop.support.DefaultPointcutAdvisor">
 
        <!--注入切入点-->
 
        <property name="pointcut" ref="createMethodPointcutBean"/>
 
 
 
        <!--注入通知-->
 
        <property name="advice" ref="logAdviceBean"/>
 
    </bean>

使用Aspectj实现切面 

<!--业务组件bean-->
 
<bean id="userServiceBean" class="com.apesource.service.impl.UserServiceImpl"/>
 
 
 
<!--日志Aspect切面-->
 
<bean id="logAspectjBean" class="com.apesource.log.LogAspectj"/>
 
 
 
<!--使用Aspectj实现切面,使用Spring AOP进行配置-->
 
<aop:config>
 
    <!--配置切面-->
 
    <!--注入切面bean-->
 
    <aop:aspect ref="logAspectjBean">
 
        <!--定义Pointcut:通过expression表达式,来查找 特定的方法(pointcut)-->
 
        <aop:pointcut id="pointcut"
 
                     expression="execution(* com.apesource.service.impl.*.create*(..))"/>
 
 
 
        <!--配置"前置通知"-->
 
        <!--在pointcut切入点(serviceMethodPointcut)查找到 的方法执行"前",
            来执行当前logAspectBean的doBefore-->
 
        <aop:before method="beforeAdvice" pointcut-ref="pointcut"/>
 
 
 
        <!--配置“后置通知”-->
 
        <!--returning属性:配置当前方法中用来接收返回值的参数名-->
 
        <aop:after-returning returning="returnVal" 
 
                             method="afterReturningAdvice" pointcut-ref="pointcut"/> 
 
        <aop:after method="afterAdvice" pointcut-ref="pointcut"/>
 
        
 
        <!--配置"环绕通知"-->
 
        <aop:around method="aroundAdvice" pointcut-ref="pointcut"/>
 
        
 
        <!--配置“异常通知”-->
 
        <!--throwing属性:配置当前方法中用来接收当前异常的参数名-->
 
        <aop:after-throwing throwing="ex" method="throwAdvice" pointcut-ref="pointcut"/>
 
    </aop:aspect>
 
 
 
</aop:config>

Spring AOP的实现原理

Spring AOP 采用了两种混合的实现方式:JDK 动态代理和 CGLib 动态代理。

JDK动态代理:Spring AOP的首选方法。每当目标对象实现一个接口时,就会使用JDK动态代理。目标对象必须实现接口
CGLIB代理:如果目标对象没有实现接口,则可以使用CGLIB代理

JDK动态代理基于接口,CGLIB代理基于类文章来源地址https://www.toymoban.com/news/detail-554759.html

spring注解实现AOP 

package com.test.aop2;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;


/**
 * 注解方式声明aop
 * 1.用@Aspect注解将类声明为切面(如果用@Component("")注解注释为一个bean对象,那么就要在spring配置文件中开启注解扫描,<context:component-scan base-package="com.cjh.aop2"/>
 *      否则要在spring配置文件中声明一个bean对象)
 * 2.在切面需要实现相应方法的前面加上相应的注释,也就是通知类型。
 * 3.此处有环绕通知,环绕通知方法一定要有ProceedingJoinPoint类型的参数传入,然后执行对应的proceed()方法,环绕才能实现。
 */
@Component("annotationTest")
@Aspect
public class AnnotationTest {
    //定义切点
    @Pointcut("execution(* *.saying(..))")
    public void sayings(){}
    /**
     * 前置通知(注解中的sayings()方法,其实就是上面定义pointcut切点注解所修饰的方法名,那只是个代理对象,不需要写具体方法,
     * 相当于xml声明切面的id名,如下,相当于id="embark",用于供其他通知类型引用)
     * <aop:config>
        <aop:aspect ref="mistrel">
            <!-- 定义切点 -->
            <aop:pointcut expression="execution(* *.saying(..))" id="embark"/>
            <!-- 声明前置通知 (在切点方法被执行前调用) -->
            <aop:before method="beforSay" pointcut-ref="embark"/>
            <!-- 声明后置通知 (在切点方法被执行后调用) -->
            <aop:after method="afterSay" pointcut-ref="embark"/>
        </aop:aspect>
       </aop:config>
     */
    @Before("sayings()")
    public void sayHello(){
        System.out.println("注解类型前置通知");
    }
    //后置通知
    @After("sayings()")
    public void sayGoodbey(){
        System.out.println("注解类型后置通知");
    }
    //环绕通知。注意要有ProceedingJoinPoint参数传入。
    @Around("sayings()")
    public void sayAround(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("注解类型环绕通知..环绕前");
        pjp.proceed();//执行方法
        System.out.println("注解类型环绕通知..环绕后");
    }
}

到了这里,关于spring 详解六 AOP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring高手之路-Spring的AOP失效场景详解

    目录 前言 1.非Spring管理的对象 2.同一个Bean内部方法调用 3.静态方法 4.final方法 5.异步方法 总结 Spring的AOP(面向切面编程)是一种强大的技术,用于在应用程序中实现横切关注点的模块化。虽然Spring的AOP在大多数情况下都是有效的,但在某些场景下可能会失效。下面来分析

    2024年01月21日
    浏览(40)
  • 【Spring教程16】Spring框架实战:详解解读AOP配置管理中AOP切入点表达式和通知类型

    欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 AOP的工作流程和AOP的核心概念》 前面的案例中,有涉及到如下内容: 对于

    2024年02月04日
    浏览(40)
  • 【Spring】AOP进阶-JoinPoint和ProceedingJoinPoint详解

    在Spring AOP中,JoinPoint和ProceedingJoinPoint都是关键的接口,用于在切面中获取方法的相关信息以及控制方法的执行。它们的主要区别在于它们在AOP通知中的使用方式和功能。 Joinpoint是面向切面编程(AOP)中的一个重要概念,指的是在应用程序执行过程中可以被拦截的特定点。在

    2024年02月04日
    浏览(35)
  • spring AOP中pointcut表达式详解

    📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂领域博主】!😜😜😜 喜欢java和python,平时比较懒,能用程序解决的坚决不手动解决😜😜😜 ✨ 如果有对【java】感兴趣的【小可

    2024年02月13日
    浏览(40)
  • Spring系列篇--关于AOP【面向切面】的详解

    目录 一.AOP是什么 二.案例演示  1.前置通知1.1 先准备接口 1.2然后再准备好实现类 1.3对我们的目标对象进行JavaBean配置  1.4 编写前置系统日志通知 1.5配置系统通知XML中的JavaBean 1.6 配置代理XML中的JavaBean 1.7 测试代码开始测试 注意这里有一个报错问题!!! 2. 后置通知2.1 先准

    2024年02月12日
    浏览(40)
  • Java spring Aop实战

    Spring AOP 1. 实战 1.实战 创建工程和依赖 数据库建表 实体类 Mapper 接口 方法一 方法二 Service 包 接口1: 实现接口 Mapper Mapper 1 Mapper 2 配置xml文件 Xml 1 Xml 2 Spring 配置文件 Mybatis配置文件 测试类 数据库结果 测试2 测试3 不符合业务逻辑,加入事物 头文件 只能在service实现类加 重

    2024年02月15日
    浏览(38)
  • java Sping aop 以及Spring aop 的应用事务管理

    线程死锁概念和如何避免死锁的发生: 线程的通信 wait notify() notify():---Object类 线程的状态: NEW ---start()---就绪状态---CPU时间片---运行状态 RUNNABLE]- --sleep()--- TIMED_WAITING ---wait()---- WAITING ----sysn---Blocked---- 终止状态[T] 线程池: 常见的线程池种类: 4种和原始 在软件业,AOP为Aspect Ori

    2024年02月12日
    浏览(40)
  • 【Spring教程21】Spring框架实战:Spring事务简介、AOP事务管理、代码示例全面详解

    欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《AOP(面对切面编程)知识总结》 事务作用:在数据层保障一系列的数据库

    2024年02月04日
    浏览(44)
  • 【Spring进阶系列丨第八篇】Spring整合junit & 面向切面编程(AOP)详解

    ​ @ContextConfiguration注解需要注意的细节是: classes:指定的是主配置类的字节码 locations:指定xml文件的位置 ​ 首先来看一个问题,假如我现在有一个UserServiceImpl用户业务类,其中呢,有一个保存用户的方法,即: ​ 现在的需求是:我要在保存用户之前新增事务的功能,你

    2024年04月13日
    浏览(56)
  • 8.1Java EE——Spring AOP

            Spring的AOP模块是Spring框架体系中十分重要的内容,该模块一般适用于具有横切逻辑的场景,如访问控制、事务管理和性能监控等 一、AOP概述         AOP的全称是Aspect Oriented Programming,即面向切面编程。和OOP不同,AOP主张将程序中相同的业务逻辑进行横向隔离,

    2024年02月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包