前言

说句实话,在工作中,使用的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. [非常重要] 通过ssh的方式提交github

    通过ssh的方式提交github - 重要文章!!vscode提交github 原因: github的https的clone项目报错,所以改用ssh的方式 1 本地创建ssh秘钥 目录是 .ssh 我 ...

  2. IDEA或Android Studio用书签功能标识代码

    原文地址:IDEA或Android Studio用书签功能标识代码 | Stars-One的杂货小窝 在之前的维护工作中,有时候翻源码的时候,找到了一个文件的某行关键,之后一层层进去之后,又突然不记得 ...

  3. Android Studio源码导入与调试

    从事Android开发都需要涉及到Android源码的阅读,特别是系统应用或者Framework开发,读代码的时间远远比写代码的时间更多. 一. 生成iml与ipr 在Android Studio中导 ...

  4. Spring Boot学习日记9

    在springboot项目中的resources目录下新建一个文件 application.yml 编写一个实体类 Dog: package com.example.springboot02confi ...

  5. 如何利用云流送(Cloud Streaming)构造一个全三维、沉浸式的数字化虚拟景区

    随着科技的发展,数字化虚拟景区已经离我们越来越近!所谓数字化虚拟景区,即利用现代计算机数字技术,模拟真实景区,实现在计算机和互联网上再现景区的真实场景. 数字化虚拟景区一般包含以下内容: 数字电子沙盘 ...

  6. linux下永久添加静态路由-不同

    linux下永久添加静态路由-不同 添加路由的命令: 1,route add route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0#添加一 ...

  7. App启动页面优化

    目录介绍 01.存在白屏问题 1.1 问题描述 1.2 问题分析 02.解决白屏的办法 2.1 解决方案分析 2.2 第一种解决方案 2.3 第二种解决方案 2.4 注意要点 03.Applicati ...

  8. Three.js的基础使用

    1. 引言 Three.js是著名的JavaScript 3D图形库,用于浏览器中开发 3D 交互场景的 JS 引擎,可以快速的搭建三维场景 Three.js官网为:创建一个场景 – three.js ...

  9. 记录--Vue自动生成组件名

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 unplugin-generate-component-name 一款用于以文件夹名或者setup标签写入名字来自动生成Vue组件名的插件 ...

  10. 性能测试系列:Oracle数据库awr报告使用与分析

    一 AWR报告生成 1.生成AWR(Automatic Workload Repository)报告:sqlplus / as sysdbaSQL>@?/rdbms/admin/awrrpt.s ...