Spring AOP实现

  • 前言
  • AOP案例实现
    • 1.编写目标类
    • 2.编写切面类
    • 3.编写配置类
    • 4.编写测试类
  • end...

前言

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP的使用场景:
日志记录,跟踪,优化和监控
事务的处理
持久化
性能的优化
资源池,如数据库连接池的管理
系统统一的认证、权限管理等
应用系统的异常捕捉及处理
。文章课程链接:尚硅谷spring注解驱动教程(雷神)

AOP案例实现

首先,我们引入AOP依赖和Springboot的测试依赖,如下

<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4.3.12.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>
</dependency>

1.编写目标类

目标类就是我们需要使用到AOP的类,比如在目标类的某个方法执行前打印日志(前置通知)。

public class TargetClass {public String testAop (String x) {if (x == null) {throw new  NullPointerException("参数能不能为空!");}System.out.println("方法执行了!");return "2021英雄联盟全球总决赛:" + x;}
}

2.编写切面类

AOP中有如下通知方法:
前置通知(@Before):在目标方法运行之前运行。
后置通知(@After):在目标方法运行结束之后运行,无论目标方法是正常结束还是异常结束都会执行。
返回通知(@AfterReturning):也称正常返回通知,在目标方法正常返回之后运行。
异常通知(@AfterThrowing):在目标方法运行出现异常之后运行。
环绕通知(@Around):环绕通知围绕在目标方法前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。

切面类用于动态的感知目标类方法的执行情况,并做出相应的操作。该类需要加上 @Aspect 注解,告诉Spring这是一个切面类。
切点表达式:如果切入点表达式都一样,可以抽取出一个公共的切入点表达式。如:
@Pointcut(“execution(public void aop.test.TargetClass.(…))")
不一样,则需要单独标在方法上,如:
@Before("execution(public void aop.test.XXX.
(…))”)

@Aspect
public class AopAspect {// 如果切入点表达式都一样,那么我们可以抽取出一个公共的切入点表达式@Pointcut("execution(public String aop.test.TargetClass.*(..))")public void pointCut() {}@Before("pointCut()")public void methodStart(JoinPoint joinPoint) {System.out.println("方法运行......@Before");}@After("pointCut()")public void methodEnd() {System.out.println("方法结束......@After");}@AfterReturning("pointCut()")public void methodReturn() {System.out.println("方法正常返回......");}@AfterThrowing("pointCut()")public void methodException() {System.out.println("方法出现异常......");}
}

可以看到,上面的切面类中,各个通知方法只是进行了简单的打印,实际开发工作中,我们肯定需要获取到是哪个方法、参数、结果等。为实现此功能,我们在方法上加上JoinPoint 参数。如下

@Aspect
public class AopAspect {// 切点表达式一样,可抽取为一个@Pointcut("execution(public String aop.test.TargetClass.*(..))")public void pointCut() {}@Before("pointCut()")public void methodStart(JoinPoint joinPoint) {Object[] args = joinPoint.getArgs();System.out.println(joinPoint.getSignature().getName() + "方法运行......@Before,参数列表是:{" + Arrays.toString(args) + "}");}@After("pointCut()")public void methodEnd(JoinPoint joinPoint) {System.out.println(joinPoint.getSignature().getName() + "方法结束......@After,");}@AfterReturning(pointcut = "pointCut()", returning = "result")public void methodReturn(JoinPoint joinPoint, Object result) {System.out.println(joinPoint.getSignature().getName() + "方法正常返回......@AfterReturning,运行结果是: " + result + "");}// 在目标方法(即div方法)出现异常,被调用@AfterThrowing(value = "pointCut()", throwing = "exception")public void methodException(JoinPoint joinPoint, Exception exception) {System.out.println(joinPoint.getSignature().getName() + "方法出现异常......异常信息:" + exception + "");}
}

注意,当我们需要返回结果或者异常信息时,需要加入相应参数,并在注解中指定,注解中的名称与参数名一致。
特别注意:JoinPoint joinPoint 只能放在第一个参数位置,否则Spring无法识别,会报错!

3.编写配置类

配置类用于将我们的目标类和切面类注册到IOC容器中,并开启AOP自动代理,注解为 @EnableAspectJAutoProxy,这样AOP才会生效。

@EnableAspectJAutoProxy
@Configuration
public class AopConfig {@Beanpublic AopAspect aopAspect() {return new AopAspect();}@Beanpublic TargetClass targetClass() {return new TargetClass();}
}

4.编写测试类

测试类中的目标对象要从IOC容器中获取,否则AOP怎么可能生效呐。

public class Test {@org.junit.Testpublic void test() {// 获取容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AopConfig.class);// 不要自己创建这个对象,应从IOC容器中获取TargetClass targetClass = applicationContext.getBean(TargetClass.class);targetClass.testAop("我们是冠军,恭喜EDG!");// 关闭容器applicationContext.close();}
}

结果,分别为传入 null 时和 我们是冠军,恭喜EDG! 时。

----手动分隔线 -----

end…

如果总结的还行,就点个赞呗 @_@ 如有错误,欢迎指点,下一篇
spring注解驱动开发-6 Spring AOP实现原理···

spring注解驱动开发-5 Spring AOP实现相关推荐

  1. spring注解驱动开发-6 Spring AOP实现原理

    Spring AOP实现原理 前言 1.@EnableAspectJAutoProxy注解原理 2.AnnotationAwareAspectJAutoProxyCreator 分析 1.分析前工作, ...

  2. spring注解驱动开发-8 Spring 扩展原理

    Spring 扩展原理 前言 BeanFactoryPostProcessor 测试实例编写 ExtConfig MyBeanFactoryPostProcessor ExtTest 源码分析 Bea ...

  3. spring注解驱动开发-4 Spring 自动装配

    Spring 自动装配 前言 Spring 自动装配的几种方式 1.@Autowired @Qualifier("组件id") @Primary 2.@Resource方式 3.@ ...

  4. spring注解驱动开发-7 Spring声明式事务

    Spring 声明式事务 前言 @EnableTransactionManagement AutoProxyRegistrar InfrastructureAdvisorAutoProxyCreato ...

  5. 【小家Spring】Spring注解驱动开发---向Spring Ioc容器中注册Bean的7种方式

    每篇一句 比你有钱的人一定会比你努力,而比你努力的人终有一天会比你有钱 前言 Spring是一个非常强大的反转控制(IOC)框架,以帮助分离项目组件之间的依赖关系.因此可以说Spring容器对Bean ...

  6. 0、Spring 注解驱动开发

    0.Spring注解驱动开发 0.1 简介 <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作 ...

  7. Spring注解驱动开发第26讲——总有人让我给他讲讲@EnableAspectJAutoProxy注解

    @EnableAspectJAutoProxy注解 在配置类上添加@EnableAspectJAutoProxy注解,便能够开启注解版的AOP功能.也就是说,如果要使注解版的AOP功能起作用的话,那么 ...

  8. 【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解

    写在前面 最近,二狗子入职了新公司,新入职的那几天确实有点飘.不过慢慢的,他发现他身边的人各个身怀绝技啊,有Spring源码的贡献者,有Dubbo源码的贡献者,有MyBatis源码的贡献者,还有研究A ...

  9. SPRING注解驱动开发-雷神课程超详细笔记

    SPRING注解驱动开发-雷神课程超详细笔记 时间:2021-03-21 2022-04-06更新:最近翻起一年多前写的笔记复习,还是收获颇多,很多当时无法理解的知识现在慢慢能理解了,可能是工作一年的 ...

最新文章

  1. webservice客户端开发
  2. textarea选中行删除_Easy Data Transform如何在Excel中删除重复的行?
  3. J03-Java IO流总结三 《 FileInputStream和FileOutputStream 》
  4. BGP劫持信息有望通过基于推特的系统放送
  5. open函数_全!Python函数和文件操作合集(长文系列第三篇)
  6. FlexDisPlayRoom正在发货「可在线玩弄」
  7. 【软件安装】CuteFTP Pro安装过程(含安装包)
  8. 学科实践活动感悟50字_社会实践感悟50字_寒假社会实践感悟
  9. Sql递归(用with 实现递归查询)
  10. 数据集分享 | IWR1642呼吸心跳数据集
  11. 软件测试面试前必备题库(必备理论基础复习)
  12. Leetcode 345 Reverse Vowels of a String 字符串处理
  13. 目前自己使用的一些软件资源(百度云持续更新)
  14. vmware16安装macOS
  15. PyCharm 安装 订制模板
  16. 上海泛微软件有限公司笔试之体验
  17. 部门新来的00后测试员已把我卷崩溃,老油条表示真干不过,但是...
  18. 操控xls文件的jxl包下载
  19. 火力全开,一网打尽Python常用知识点!
  20. RK3229 中文介绍

热门文章

  1. 机器学习实战教程(一):K-近邻算法---电影类别分类
  2. 【计算机视觉的修炼秘笈】深度好文,持续更新
  3. vue实现浮动广告(浏览器范围内匀速移动)
  4. onethink-1.1开发版安装
  5. mysql阿里云不显示中文乱码_MySQL命令窗口下中文显示乱码的解决过程
  6. android脚本之家记事本,99笔记(手机记事本软件) for android 1.8.6 安卓版
  7. Mac终端神器iterm2常用配置
  8. 如何备份服务器win2008r2系统,数据保护:Win2008 R2 中的备份基础
  9. 调试433M模组遇到的问题
  10. 基于STM32F030的ADC功能实现