前言

说句实话,在工作中,使用的aop不是特别多,但是特别重要,一般是辅助程序,在现代开发者辅助程序相当重要,比如说我们需要打印一些log,但是我们不可能去卸载我们的业务程序中,因为这太。。。。。

正文

那么如何开启一个aop呢?用log举例,我们不可能去写log在我们的业务程序中,如果是这样的话,是真的难以维护。

下面实例一个需求来显示出一些问题:

/**
*需求
* 将一个方法的发生前打印出log,发生后打印log,异常打印log,要求解耦
* 通知:
* 前置通知(@Befor)
* 后置通知 (@After)
* 返回通知 (@AfterReturning)
* 异常通知 (@AfterThrowing)
* 环绕通知(@Around):动态代理,手动推进目标方法运行(joinpoint.procced)
* 步骤:
* 1.将业务逻辑组件和切面类都加入到容器中,告诉spring 哪个是切面类,开启基于注解的aop模式@EnableAspectJAutoProxy
* 2.在切面类上的每一个通知方法上标注通知注解,告诉spring 何时何地运行(切入点表达式)

首先加入容器中:

@Configuration
@EnableAspectJAutoProxy
public class MainConfigofAOP { //业务逻辑类加入到容器中
@Bean
public MathCalculator calculator(){
return new MathCalculator();
} //切面类加入到容器中
@Bean
public LogAspects logAspects(){
return new LogAspects();
}
}

将切面类和业务逻辑类加入到容器中,然后开启切面@EnableAspectJAutoProxy。

接下来我们看下如何告诉切面注解实现类,哪个是切面,看下切面类:

/**
* 切面类
*/
@Aspect
public class LogAspects { //公共的切入点表达式
@Pointcut("execution(public int com.axm.demo.aop.MathCalculator.*(..))")
public void pointCut(){ }
// @Before("public int com.axm.demo.aop.div(int i,int j)")
@Before("pointCut()")
public void logStart(JoinPoint joinPoint)
{
System.out.println(""+joinPoint.getSignature().getName()+"方法运行前执行,参数是:"+Arrays.asList(joinPoint.getArgs()));
} @After("pointCut())")
public void logEnd(JoinPoint joinPoint)
{
System.out.println(""+joinPoint.getSignature().getName()+"方法运行后执行,无论是否异常都会执行");
} @AfterReturning(value="pointCut()",returning = "result")
public void resultReturn(JoinPoint joinPoint,Object result)
{
System.out.println(""+joinPoint.getSignature().getName()+"方法成功后执行!获取返回结果:"+result);
}
@AfterThrowing(value = "pointCut()",throwing = "exception")
public void logException(JoinPoint joinPoint,Exception exception)
{
System.out.println(""+joinPoint.getSignature().getName()+"方法成功后执行!查看异常:"+exception.getMessage());
}
}

注解:@Aspect 告诉应用该类为切面类。

@Pointcut("execution(public int com.axm.demo.aop.MathCalculator.*(..))")

是公共表达式,@Before("pointCut()")表示继承pointCut方法的注解。

public int com.axm.demo.aop.MathCalculator.*(..) 表示在MathCalculator 中的所以方法将会被监听。

JoinPoint joinPoint 表示目标方法的一些信息。

这些都可以去文档中查看。

再看下业务逻辑类:

public class MathCalculator {

    public  int div(int i,int j){
return i/j;
}
}

业务逻辑类,就像是正常一样去书写即可,只要加入容器中。

也就是说我们在不影响现在代码的情况下,可以去实现一些辅助功能。

这里,测试一下。

@Test
public void test()
{
AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(MainConfigofAOP.class);
MathCalculator mathCalculator=applicationContext.getBean(MathCalculator.class);
mathCalculator.div(1,1);
}

好的,看下结果吧。

总结

即将开启源码模式。

面向切面编程AOP[一](java 代码详解)的更多相关文章

  1. Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...

  2. Spring学习手札(二)面向切面编程AOP

    AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...

  3. Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)

    一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...

  4. Spring框架学习笔记(2)——面向切面编程AOP

    介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...

  5. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  6. 【串线篇】面向切面编程AOP

    面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...

  7. 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制

    spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...

  8. 设计模式之面向切面编程AOP

    动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...

  9. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

  10. 面向切面编程AOP

    本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...

随机推荐

  1. C++ Qt开发:QNetworkAccessManager网络接口组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QNe ...

  2. aardio ide 字体 及设置

    需求 aardio ide 只支持一个字体,英文字体肯定是Fira 但是中文字体不好,所以只好将两个字体合并上使用. 有教程.但是我发现已经有合并好的,就拿来使用吧放到fonts目录里面 代码 imp ...

  3. Chrome Audio Capture - 录音插件 功能很简单,就是点击录音 文本转语音用

    Chrome Audio Capture - 录音插件 功能很简单,就是点击录音 文本转语音用

  4. Review Book for GEE(Graduate Entrance Examination)

    English is made up of phrases and idioms, in the case of both written and spoken usage. When learnin ...

  5. QT 自定义QGraphicsItem 缩放后旋转 图形出现漂移问题

    实现自定义QGraphicsItem缩放和旋转时,遇到了这样一个问题:将item旋转一个角度,然后拖拽放大,再次进行旋转时图像会发生漂移.原本以为是放大后中心点位置没有改变,导致旋转时以原中心的旋转出 ...

  6. Java加密技术(四)——非对称加密算法RSA

    Java非对称加密算法rsa     接下来我们介绍典型的非对称加密算法--RSA RSA     这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很 ...

  7. 虚拟现实(VR)在医疗保健中的5种应用

    医疗保健中的VR虚拟现实 虚拟现实的由来已久,18世纪,法国的医生使用布制的分娩模拟器向助产师和外科医生教授医学技术.在20世纪60年代初,医生一边对心肺复苏学员口述心肺复苏的技巧,一边使用一家塑料玩 ...

  8. jQuery(常用API)

    jQuery简介 1.基本使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  9. 三维模型OBJ格式轻量化的跨平台兼容性问题分析

    三维模型OBJ格式轻量化的跨平台兼容性问题分析 三维模型的OBJ格式轻量化在跨平台兼容性方面具有重要意义,可以确保模型在不同平台和设备上的正确加载和渲染.本文将分析OBJ格式轻量化的跨平台兼容性技术, ...

  10. | [0/8] Installing jquery@3.x[npminstall:get] retry GET https://registry.npm.taobao.org/jwebdriver after 100ms, retry left 4, error: Error: certificate has expired ClientRequest.<anonymous>

    昨天用开源项目UIRecorder初始化时报错,查看日志发现是淘宝的源证书过期,如下: PS E:\20231213\uirecorder\uirecorder_test> PS E:\2023 ...