前言

说句实话,在工作中,使用的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. TLS原理与实践(二)

    主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 引言 在上一篇博客中,我们通过<一文读懂TLS1.2协议](ht ...

  2. vscode 创建 git tag,并推送到远程

    Step. 1: 创建tag 左侧 源代码管理 右上角 ... 标记 -> 创建标记 输入tag名称 回车 输入tag描述 Step. 2: 查看tag 使用命令 git tag 查看当前所有的 ...

  3. 基于Python的 如何检查字符串输入是否为数字

    一 概念 这种有很多常用的方法,这里只介绍一种常用的方法是使用正则表达式来匹配数字的模式.通过定义一个匹配数字的正则表达式,然后使用re模块中的search()方法来进行匹配. 二 例子: 下面是一个 ...

  4. day02-Spring基本介绍02

    Spring基本介绍02 5.简单模拟Spring基于XML配置的程序 5.1需求说明 自己写一个简单的Spring容器,通过读取beans.xml,获取第一个Javabean:Monster的对象, ...

  5. github拉项目显示timeOut

    参考:https://blog.csdn.net/qq_37424778/article/details/132018804 自己尝试在github上拉项目,但是报错LibreSSL SSL_read ...

  6. C++ allocator类

    new在申请内存时,他将内存分配和对象的构造放在了一起,delete也将对象的析构和内存的释放结合在一起.但allocator类允许将内存分配和对象构造分开. 分配内存 allocator<st ...

  7. 前后端分离Ajax入门

    前后端分离之Ajax入门 一.概念 Ajax(Asynchronous Javascript And XML),即是异步的JavaScript和XML,Ajax其实就是浏览器与服务器之间的一种异步通信 ...

  8. 05.java多线程问题

    目录介绍 5.0.0.1 线程池具有什么优点和缺点?为什么说开启大量的线程,会降低程序的性能,那么该如何做才能降低性能? 5.0.0.3 线程中start和run方法有什么区别?wait和sleep方 ...

  9. 记录-使用双token实现无感刷新,前后端详细代码

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 近期写的一个项目使用双token实现无感刷新.最后做了一些总结,本文详细介绍了实现流程,前后端详细代码.前端使用了Vue3+Vite ...

  10. java DES 加密和解密

    代码如下 import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESK ...