Spring原理学习系列之三:Spring AOP原理(从源码层面分析)-------上部

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 提问题

  • AOP概念

  • AOP代码示例

  • 源码分析

  • 总结


一、提问题


到底什么是AOPSpring框架到底在什么阶段进行数据织入的?AOP在实际项目开发中到底有什么作用以及怎样将AOP的编程思想运用到我们的实际项目开发中?

二、AOP概念


AOP(Aspect Orient Programming),我们通常称为面向切面编程。所谓切面是相对于面向对象来说的。面向对象是将实物抽象为对象,这是个纵向的概念。而面向切面是一个横向的概念,它更加关注那些散落在代码中公用的不涉及具体业务逻辑的通用处理方式,例如日志、权限验证以及统一异常处理等等。它是对于面向对象编程思想的一种结构化补充。核心思想就是将与业务逻辑无关的进行统一的框架织入,不对原有代码以及业务逻辑造成侵入。

Spring AOP在运行时,能够动态地将代码切入到指定的类的指定方法、指定位置上的编程思想就是面向切面编程,这种切入的特点是不影响原来的业务逻辑。但是像AspectJ可以在编译阶段以及类加载阶段进行织入。

一些概念的说明:

  1. 切面

所谓切面,按照自己的理解可以把它看作为一把刀,将他横切于其他物品,通过@Aspect来将类定义一个切面,它就是切点与通知的结合,如下图所示。

在这里插入图片描述

  1. 切点

本质上来说,就是需要定义一个切入点表达式,使得可以在增强处理中使用到。通过切点定位和筛选特定的连接点。它关注通知需要织入的一个或者多个连接点,切入点包括两部分:

(1)切入点表达式:指定切入点与哪些方法进行匹配;

(2)切入点名称:方法签名

  1. 连接点

连接点是一个相对虚拟的概念,可以将它理解为切点的集合,也就是Spring允许我们进行通知操作的地方,比如方法、异常抛出的地方,如果使用aspectj则也支持在构造器中或者属性中允许通知。

  1. 通知

通俗地说,通知就是我们需要实现的功能,可以分为前置、后置、异常、最终以及环绕通知这五类。例如日志,权限等业务逻辑。

  • 前置通知:在目标方法或者连接点被调用前执行通知操作;

  • 后置通知:在某些连接点执行完成之后进行通知操作;

  • 异常通知:在方法抛出异常退出当前时进行通知操作;

  • 最终通知:当切入点退出时无论是方法正常执行结束还是异常抛出后退出执行的通知操作;

  • 环绕通知:包围一个切点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。

三、AOP代码示例


1.定义一个普通业务逻辑方法

@Component(“userDao”)

public class UserDao {

/**

  • @Description: 查询

  • @Return

  • @Author taomeng

  • @Version V1.0.0

  • @CreateDate: 2018/9/23 11:31

*/

public void query() {

System.out.println(“query user data!!!”);

}

}

2.定义一个切面类,同时在这个切面类中将切点等进行定义。

/**

  • @Auther: taomeng

  • @Date: 2018/9/17 23:32

  • @Description: 定义切面类

*/

@Configuration

@Aspect

@ComponentScan(basePackages = {“com.tm.springrun.module”})

@ImportResource(locations = {“classpath:spring-context.xml”})

public class AopConfig {

/**

  • @Description:定义切点

  • @Return

  • @Author taomeng

  • @Version V1.0.0

  • @CreateDate: 2018/9/23 11:32

*/

@Pointcut(“execution(* com.tm.springrun.module.dao.UserDao.query())”)

public void declareJointPointExpression(){}

@Before(“declareJointPointExpression()”)

public void beforeMethod(JoinPoint joinPoint) {

String method = joinPoint.getSignature().getName();

System.out.println(“The method of before:” + method);

}

@After(“declareJointPointExpression()”)

public void afterMethod(JoinPoint joinPoint) {

String method = joinPoint.getSignature().getName();

System.out.println(“The method of after:” + method );

}

}

3.在Spring Context中获取Bean的实例,同时执行Bean实例的方法。

/**

  • @Auther: taomeng

  • @Date: 2018/9/17 23:37

  • @Description: 测试AOP

*/

public class Test {

public static void main(String[] args) {

//1.加载spring环境

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AopConfig.class);

//2.获取spring context中的bean的实例

UserDao userDao = (UserDao)annotationConfigApplicationContext.getBean(“userDao”);

//3.执行bean中的方法

userDao.query();

}

}

同时需要在配置文件中开启AOP,如下所示:

aop:aspectj-autoproxy/

最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司21年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
4676008183)]

最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司21年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分

[外链图片转存中…(img-NLYUqxVL-1714676008184)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值