SpringAOP详解

SpringAOP详解+快速入门 本文介绍了 Spring AOP 的实现原理,并通过实例解析详细阐述了其实现过程。在使用 Spring AOP时,我们需要定义切面类,并为需要实现AOP的方法添加注解。 Spring 会自动将切面逻辑插入到这些方法中,从而实现AOP的功能。 阅读详情

SpringAOP简介

AOP(Aspect Oriented Program):即面向切面编程

在面向切面编程的思想里面,把功能分为核心业务功能和周边功能

  • 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务

  • 所谓的周边功能,比如性能统计,日志,事务管理等等

在SpringAOP中将这些周边功能称为切面,将核心业务逻辑与这些周边功能分别独立开始,然后将它们交织在一起就是AOP需要做的事情

AOP将业务模块锁公共调用的、非业务逻辑的功能封装起来;这样的好处?

一:所以这些非核心业务功能都集中在一起,而不是分散到多处代码中,便于减少系统的重复代码,降低模块间的耦合度,有利于维护

二:服务模块更简洁,因为它们只包含主要关注点或核心功能的代码,次要的非业务功能(周边功能)被转移到切面中

AOP当中的概念

  • 通知(Advice):通知定义了切面是什么以及何时使用
  • 连接点(Join point):连接点指的是在应用执行过程中插入切面的一个点。
  • 切点(Pointcut):在哪些类或方法中加入周边功能
  • 切面(Aspect):切面是通知和切点的结合,简单来说:切面是什么以及在何时和何处完成其功能
  • 织入(Weaving):将切面在指定的连接点织入到目标对象中

使用注解来实现SpringAOP

首先我们新建一个SpringAop的包,创建一个HavingDinner类

package SpringAop;

import org.springframework.stereotype.Component;

@Component
public class HavingDinner{

    public void eat(){
        System.out.println("吃晚饭!");
    }
}

然后创建我们的切面类AOP

package SpringAop;

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

@Aspect
@Component
public class AOP {
    @Before("execution(* SpringAop.HavingDinner.eat(..))")
    public void BuyIngredients(){
        System.out.println("购买食材!");
    }
    @Before("execution(* SpringAop.HavingDinner.eat(..))")
    public void Cook(){
        System.out.println("将食材进行烹饪!");
    }
    @After("execution(* SpringAop.HavingDinner.eat(..))")
    public void WashDishes(){
        System.out.println("吃完后洗碗!");
    }
}

然后创建一个配置类进行显示配置一下

package SpringAop;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class AopConfig {

}

创建我们的测试类

import SpringAop.AopConfig;
import SpringAop.HavingDinner;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestAop {

    @Test
    public void Test(){
        ApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class);
        HavingDinner havingDinner = (HavingDinner)context.getBean("havingDinner");
        havingDinner.eat();
    }
}

先看一下运行结果

简单解释一下

  • @Component注解表明这是一个组件类,并告诉Spring为这个类创建一个bean
  • @Aspect注解表明这不仅仅是一个Java类,还是一个切面
  • 至于AopConfig的作用以及@Component注解建议看我的这篇文章:Spring IoC和DI详解以及装配Bean
  • @EnableAspectJAutoProxy注解:启用自动代理功能
  • 如果不使用@EnableAspectJAutoProxy,那么AOP类即使使用@AspectJ注解,Spring也不会将其视为切面,AOP类中的注解也不会被解析,Spring也不会创建将其转换为切面的代理

下面仔细解释一下AOP类中的注解

下面是AspectJ的一些注解,上面只用了@Before和@After

注解通知
@After通知方法会在目标方法返回或抛出异常后调用
@AfterReturning通知方法会在目标方法返回后调用
@AfterThrowing通知方法会在目标方法抛出异常后调用
@Around通知方法会将目标方法封装起来
@Before通知方法会在目标方法调用之前执行

定义切点

execution(* SpringAop.HavingDinner.eat(..))
  • execution:代表执行方法的时候会触发
  • *:代表任意返回类型
  • SpringAop.HavingDinner:代表类的全限定名
  • eat():被拦截的方法名称

不过在上面的表达式中每个方法都拦截eat()方法,表达式因此很长,我们也可以改成下面这样

package SpringAop;

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

@Aspect
@Component
public class AOP {
    @Pointcut("execution(* SpringAop.HavingDinner.eat(..))")
    public void eat(){}

    @Before("eat()")
    public void BuyIngredients(){
        System.out.println("购买食材!");
    }
    @Before("eat()")
    public void Cook(){
        System.out.println("将食材进行烹饪!");
    }
    @After("eat()")
    public void WashDishes(){
        System.out.println("吃完后洗碗!");
    }
}

上面我们使用@Pointcut注解,在切面中定义了一个可重用的切点

下面一起来看看功能最强大的环绕通知,它集成了前置通知和后置通知

package SpringAop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class AOP {
    @Pointcut("execution(* SpringAop.HavingDinner.eat(..))")
    public void eat(){}

    @Around("eat()")
    public void havingEat(ProceedingJoinPoint joinPoint){
        System.out.println("购买食材!");
        System.out.println("将食材进行烹饪!");
        try{
            joinPoint.proceed();
        } catch (Throwable e ){
            e.printStackTrace();
        }
        System.out.println("吃完后洗碗!");

    }

    /*@Before("eat()")
    public void BuyIngredients(){
        System.out.println("购买食材!");
    }
    @Before("eat()")
    public void Cook(){
        System.out.println("将食材进行烹饪!");
    }
    @After("eat()")
    public void WashDishes(){
        System.out.println("吃完后洗碗!");
    }

    @AfterThrowing("eat()")
    public void exe(){
        System.out.println("方法调用出现异常");
    }*/
}

运行代码

我们可以在havingEat方法中做任何事,当我们需要将控制权交给被通知方法时,调用proceed()方法即可,所以这个新的通知方法必须要接受一个ProceedingJoinPoint对象

通过XML配置开发SpringAOP

AOP 配置元素用途
<aop:advisor>定义AOP通知器
<aop:after>定义AOP后置通知(不管被通知的方法是否执行成功)
<aop:after-returning>定义AOP返回通知
<aop:after-throwing>定义AOP异常通知
<aop:around>定义AOP环绕通知
<aop:aspect>定义一个切面
<aop:aspectJ-autoproxy>启用@AspectJ注解驱动的切面
<aop:before>定义一个AOP前置通知
<aop:config>

                                                  顶层的AOP配置元素

<aop:declare-parents>以透明的方式为被通知的对象引入额外的接口
<aop:pointcut>定义切点

 

下面将上述例子改成XML配置的形式

首先是HavingDinner类

package SpringAop;

public class HavingDinner{

    public void eat(){
        System.out.println("吃晚饭!");
    }
}

AOP类

package SpringAop;
import org.aspectj.lang.ProceedingJoinPoint;
public class AOP {

    public void havingEat(ProceedingJoinPoint joinPoint){
        System.out.println("购买食材!");
        System.out.println("将食材进行烹饪!");
        try{
            joinPoint.proceed();
        } catch (Throwable e ){
            e.printStackTrace();
        }
        System.out.println("吃完后洗碗!");

    }

    public void BuyIngredients(){
        System.out.println("购买食材!");
    }
    public void Cook(){
        System.out.println("将食材进行烹饪!");
    }
    public void WashDishes(){
        System.out.println("吃完后洗碗!");
    }

    public void exce(){
        System.out.println("方法调用出现异常");
    }
}

spring.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <bean id="havingDinner" class="SpringAop.HavingDinner"/>
    <bean id="aop" class="SpringAop.AOP" />
    <!--启用AspectJ自动代理 相当于注解@EnableAspectJAutoProxy-->
    <aop:aspectj-autoproxy />

    <aop:config>
        <!--where 在哪些地方做增加 -->
        <aop:pointcut id="eat" expression="execution(* SpringAop.HavingDinner.eat())"/>

        <!-- what 做什么增加-->
        <aop:aspect id="eatAspect" ref="aop">
            <!-- when:在什么时机(方法前/后/前后) -->
            <aop:around pointcut-ref="eat" method="havingEat"/>
            <aop:before method="BuyIngredients" pointcut-ref="eat"/>
            <aop:before method="Cook" pointcut-ref="eat"/>
            <aop:after method="WashDishes" pointcut-ref="eat"/>
            <aop:after-throwing method="exce" pointcut-ref="eat" />
        </aop:aspect>
    </aop:config>
</beans>

运行结果

参考资料

  • 《Java实战(第四版)》
  • 谷歌&&百度

 

 

 

 

 

 

SpringAOP在项目中的简单应用 SpringAOP在项目中的简单应用   一、前言   项目背景 由于公司的机房到期,需要做应用迁移(包括数据库),割接到云平台。但是又不能进行一次性割接,需要分三个阶段:第一阶段割接2个地市,第二阶段再割接9个地市,第三阶段做全盘割接。在第一、第二阶段是要保证云平台与现网平台的应用能够正常并行运行。所以,要保证两边数据访问的正常,需要对某些功能进行改造。比如,某个子功能在并行阶段是不做... 阅读详情

相关推荐

迪文屏【0】——从零搭建工程:图片显示、文本变量配置与串口数据交互实战

本文以迪文屏T5L系列为例,详细介绍了从零搭建HMI工程的完整流程。内容涵盖硬件软件准备、DGUS工程创建、背景图片显示、文本变量配置,并重点演示了如何通过串口指令实时修改屏幕数据变量,实现动态交互。旨在帮助开发者快速掌握迪文屏开发的核心步骤与数据交互方法。

alpha的博客 349

图文详解Spring AOP,你学会了吗?

如果说 IOC 是 Spring 的核心,那么面向切面编程AOP就是 Spring 另外一个最为重要的核心,需要重点掌握@mikechen 本篇主要会详解以下六点: 1.AOP的定义 2.AOP的作用 3.AOP的应用场景 4.Spring AOP的术语 AOP核心概念 Spring AOP 通知分类 Spring AOP 织入时期 5.Spring AOP三种使用方式 方式1:使用Spring自带的AOP 方式2:使用Aspectj实现切面(普通POJO的实现方式) 方式3:使用As

qq_39652397的博客 3491

MIC(Maximal Information Coefficient)最大互信息系数

MIC(Maximal Information Coefficient)最大互信息系数是一种用于衡量两个变量之间相关性的统计量。它扩展了传统的互信息(MI)和条件互信息(CMI)的概念,具有更广泛的应用范围。MIC能够捕获包括功能性和非功能性的广泛的关联,具有普遍性和公平性。普遍性意味着在足够的样本量下,MIC能够捕捉到广泛的相关关系,而不仅仅局限于特定的功能类型;公平性则意味着MIC对不同类型的包含同等噪声的关系给出了相似的分数。需要注意的是,虽然MIC具有很多优点,但它也有一些局限性。

qlkaicx的博客 4605

SpringAOP(图文详解)

Spring实现的AOP是代理模式,给调用者使用的实际是已经过加工的对象,你编程时方法体里只写了A,但调用者拿到的对象的方法体却是xAy。x和y总还是需要你来写的,这就是增强。x和y具体在什么时候被调用总还是需要你来规定的,虽然是基于约定的声明这种简单的规定,这就是切点。

lhj520cb的博客 5万+

开源AI数字人DUIX:从零构建你的智能交互助手

本文详细介绍了如何利用开源AI数字人DUIX从零构建智能交互助手。文章阐述了DUIX作为开源项目的核心优势,包括低成本启动、低网络依赖和高度可定制性,并提供了从开发环境搭建、核心模块(AI模型、语音、形象)配置到个性化业务逻辑开发与最终部署的完整实践指南,帮助开发者快速掌握构建专属AI数字人的全流程。

weixin_29051811的博客 505

iOS自动化之打包-xcodebuild命令行打包.app并安装到ios模拟器

xcode xcodebuild xcrun ios模拟器 iOS UI自动化测试 ios自动打包安装到ios模拟器

z12347891的博客 5079

Spring之AOP的详细讲解

本文讲解的是SpringAOP,将切点、切面、通知点,逐步剖析,代码举例,配合理解!

tq02的博客 8895

南邮 2024 软件安全 实验四 自动脱壳+手动脱壳

这次这个实验很简单,就是一个简单的脱壳,然后进行爆破就行了,解法非常的多这里不多讲,会简单讲一下特殊情况这个点开是这样子:然后放进peid里面查看,我这个是原版的PEid,所以显示出来是这样:会显示nothing found,但其实如果你使用吾爱破解的魔改过的peid,它就会显示具体的壳名:然后你点击右下角的那个箭头,里面会有很多的插件用来自动脱壳:你也可以使用这个通用脱壳器,但是脱壳后的程序无法运行,这个放到后面讲。

ARbing_an的博客 2562

Spring AOP 详解

Spring AOP 详解

yyhgo_的博客 7072

嵌入式铁头山羊stm32:一文总结

本文是一篇STM32嵌入式开发的综合知识总结,涵盖了STM32基础概念、GPIO、通信协议、外设驱动等核心内容。文章首先介绍了STM32的基本概念和型号含义,然后详细讲解了GPIO的8种工作模式及实验案例。接着重点阐述了USART、I2C、SPI三种通信协议的原理和实现方法,包括硬件连接、编程接口和实验应用。此外还介绍了OLED显示原理、中断系统、定时器、ADC转换等关键技术,每个模块都配有对应的实验案例和代码实现参考。文章内容全面系统,既包含理论知识,又提供实践指导,适合作为STM32开发的快速参考手册。

古泽汉书的博客 2789

基于ESP32的智能无线广播系统开发博客

通过本项目的开发,我们成功地实现了基于ESP32的智能无线广播系统。该系统不仅具备传统广播的功能,还实现了通过Wi-Fi无线传输音频、实时广播和智能控制等多种先进功能。未来,随着技术的进一步发展,我们还可以扩展更多功能,如智能推荐广播内容、支持语音识别和控制等。希望本项目能够为嵌入式开发人员提供一些思路和参考,帮助大家在实际开发中更好地应用ESP32平台,开发出更加智能和实用的无线广播系统。

2201_76125393的博客 424

Spring AOP全面详解(超级详细)

JDK动态代理无法为没有在接口中定义的方法实现代理,假设我们有一个实现了接口的类,我们为它的一个不属于接口中的方法配置了切面,Spring仍然会使用JDK的动态代理,但是由于配置了切面的方法不属于接口,为这个方法配置的切面将不会被织入。AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。

wy971744839的博客 1752

【WLAN】【测试】WPS测试方法小结

手机 一般稍微老的手机会支持,新手机反而不支持。 比如小米6(系统版本新的话不支持)在设置——高级设置——WPS连接。 笔记本 有些笔记本(如Surface Laptop 3)天生支持WPS,比如在连接某SSID的时候,会有“也可以通过按路由器上的按钮连接”这样的字样,出来后按AP的WPS按键即可以进行连接。 Qss软件 AP mesh组网中,Controller和Agent之间通过WIFI组网,可使用WPS的方式进行连接。可利用这点用Agent来测试AP的WPS功能。 ...

一介草民,只为生活。 1万+

SpringAOP是啥,怎么用?

SpringAOP是啥,怎么用? 一、面试问题:什么是SpringAOP? SpringAOP的全称是(Aspect Oriented Programming)中文翻译过来是面向切面编程,个人理解:主要意思是我们的传统架构至上而下,后期想要从中间切入写代码添加功能,比如日志、权限、事务等,这时候我们就需要写使用代理模式写,而springaop就是专门把这一块写代码的地方给抽象了出来称为切面,从而解决的代码混乱的问题,它的底层实现也是基于代理模式(动态代理)完成的。 二、SpringAOP的应用场景有

Object_de_Father的博客 19万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SpringAOP学习--SpringAOP简介及原理

前文对AOP做了介绍,实际项目中,一般不会直接上手手动实现aop,而是使用一些高级封装的aop实现,如SpringAOP。 Spring是一个广泛应用的框架,SpringAOP则是Spring提供的一个标准易用的aop框架,依托Spring的IOC容器,提供了极强的AOP扩展增强能力,对项目开发提供了极大地便利。 前文提到AOP的实现有AspectJ、JDK动态代理、CGLIB动态代理,SpringAOP不是一种新的AOP实现,其底层采用的是JDK/CGLIB动态代理。 JDK动态代理回顾 上一篇简单介绍了

u012098021的博客 6万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SpringAOP

文章目录一、理解AOP思想二、AspectJ和SpringAOP的区别与联系1.AspectJ框架2.SpringAOP3.总结三、AOP操作术语四、Spring AOP的使用1.XML方式1.创建用于拦截的Bean2.编写通知类3.编写XML配置文件AOP4.测试类5.执行结果2.注解方式1.引入AspectJ包2.创建用于拦截的Bean3.创建Advisor4.创建配置文件5.测试6.执行结果3.小结3.AOP execution表达式五、Spring AOP五种通知的执行顺序1.XML配置方式(1)测

weixin_43094361的博客 905

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

springAOP

AOP是Aspect Oriented Programming(面向切面编程),切面是指某一特定问题,所以AOP也可以理解为面向特定方法编程。比如我们在用户登录时设置登录校验拦截器,就是对“登录校验”这一类问题的统一处理,所以拦截器是AOP的一种应用,而AOP是一种思想,拦截器就是AOP思想的一种实现。而Spring框架也实现了这种思想,提供了拦截器技术的相关接口。同样的,统一数据返回格式和统一异常处理,也是AOP思想的一种实现。

2202_75439262的博客 954

SpringAop使用详解

Spring Aop的简单使用

灏的博客 2134

SpringAOP面向切面编程

介绍面向切面编程的思想(AOP),AOP的组成,SpringAOP的简单演示使用,SpringAOP基于动态代理的实现原理。

trong_ 的烂笔头 2545

SpringAOP使用

一、AOP介绍 AOP ,面向切面编程,在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。其实就是在代码运行,进行一定的包装,如在方法执行前、方法返回后、方法抛出异常后等地方进行一定的拦截处理或者叫增强处理 先讲一下AspectJ和Spring AOP关系,网上很多文章对AspectJ存在错误说法 AspectJ: AspectJ 来自于 Eclipse 基金会,...

LJJZJ的博客 586
上一篇: Spring IoC和DI详解以及装配Bean
下一篇: Mybatis入门(1)
GL60708
博客等级 码龄10年 5粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值