Spring—Aop(1)暨初开博客感想
终于拥有属于自己的博客了,记录一点心得体会吧,生活的后花园。
本人大二,双非本科在读。很早之前就想开博客了,这种想法在去年暑假,也就是2022年的夏天尤为强烈。当时爱上了算法,每天都要刷不少的题,虽然有的是看着大佬们的题解才拿到思路的,但慢慢积累下来也养成了不少算法思维。打开博客对我来说真不是一件容易的事情,不知道写什么,写出来的东西入不了大家的眼怎么办,单纯浪费了时间怎么办…当时啊想了很多劝自己打消开博的念头,但直到现在,我才发现,如果能把当时记录下来,如今的我可以说是拥有一笔不小的财富了。现在又是一次机会了,还是抓住吧。这边就记录一点平时的学习心得和一些感悟吧,便于自己及时总结归纳,时不时也能写一些生活碎片,计划是每天晚上写一点,没有意外的每天都会有,欢迎技术交流!
最近在学习Spring,前几天都是混乱的,学一会歇一会,没有很强的连贯性。现在事情都忙完了,终于有时间空下来定心学习了。前面学习中,首先了解到了Spring的优点,在开发中能做到充分解耦,简化开发,同时提供大量的开发工具。目前学完了Spring的核心容器部分,包括有IoC(控制反转)和DI(依赖注入),Bean的配置文件装配和注解开发,见识尚为短浅,学无止境,虚心向前。下面来整理一下今天学到的AOP(面向切面编程)。
什么是AOP?
我的理解是,AOP是将一个共同的功能抽取出来,然后分配给需要他们的方法,在不惊动原有的设计的情况下,实现功能的修改。在面向对象的编程中,我们需要为某个事务编写方法时,一般都会需要什么写什么,对于完全不同的事务来说,效率很高,然而如果遇到有共性的事务时,操作就变得麻烦了起来。要对每一种事务都书写相同的方法,即使怎么熟练ctrl+cv开发,都会被这复杂的步骤折服。而AOP则解决了这一办法,例如在每次查找操作后记录操作者,操作的对象,操作的时间…就可以将其单独写为一个方法,在AOP中,这种方法称为通知。它将互通的代码抽取出,在程序运行是将其分散到需要执行的地方。区别于继承的地方在于,该过程是一种采取横向抽取机制的方式,而继承采取的是纵向的方式。生动点,或许可以比作一个家族,从爷爷到儿子到孙子,他们都继承这这个家族的Y染色体,一脉相承,这就是继承,而AOP实现的就是X染色体的发放,例如这个爷爷有3个儿子,那么无论如何,奶奶的X染色体都会发放给他们的3个儿子,这比喻应该够生动了吧!这样一来,AOP是什么就清楚了,要知道的是它能提高开发效率,增强代码的可维护性(如果要修改方法,很简单,修改通知即可),这是它成为Spring的核心思想之一的重要原因!
AOP有什么?
在大致知道AOP负什么责任之后,有必要来了解一下AOP里面有什么。
- 切面(Aspect):既然被称为面向切面编程,切面的定义尤为重要。切面是指封装的用于横向插入的类。在配置文件中使用<bean>元素指定后,方可被Spring容器识别。
- 连接点(JointPoint):是指在程序执行过程中的某个阶段点。
- 切入点(PointCut):是指切面和程序的交叉点,书中描述为需要处理的连接点。切入点指的是类或者方法名,例如应用通知到所有的含有select的方法中时,满足该规则的方法都是切入点。
- 通知增强处理(Advice):AOP在特定的切入点执行增强的处理,在定义好切入点的地方所要执行的代码。可以理解为切面类中的方法。
- 目标对象(Target Object):指所有被通知到的对象,他们有被增强的功能可以实现!(AOP核心概念)
- 代理(Proxy):将通知应用到目标对象后,被动态创建的对象。(AOP核心概念)
- 织入(Weaving):将切面代码插入到目标对象上,从而生产代理对象的过程。
AOP的工作流程是什么?
- Spring容器的启动
- 读取所有切面配置中的切入点
- 初始化bean,判定bean对应的类中的方法是否匹配到任意的切入点
匹配失败则创建一个新对象
匹配成功,则创建原始对象(目标对象)的代理对象(织入)
- 获取bean执行方法
获取bean,调用方法并执行,完成操作。
获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,便完成了操作
Spring中AOP的本质是什么:代理模式
在main函数中运行如下代码(AOP配置已完成),查看此时目标对象的class。
ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class); BookDao bookDao= ctx.getBean(BookDao.class); bookDao.update(); System.out.println(bookDao); System.out.println(bookDao.getClass());