当前位置:首页 >> 智能终端演进 >> 【Spring教程15】Spring框架实战:详解解读AOP的工作流程和AOP的核心概念,三星w699报价

【Spring教程15】Spring框架实战:详解解读AOP的工作流程和AOP的核心概念,三星w699报价

cpugpu芯片开发光刻机 智能终端演进 3
文件名:【Spring教程15】Spring框架实战:详解解读AOP的工作流程和AOP的核心概念,三星w699报价 【Spring教程15】Spring框架实战:详解解读AOP的工作流程和AOP的核心概念

目录 1 AOP工作流程2 AOP核心概念 欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 AOP入门案例实战详解》

AOP的入门案例已经完成,对于刚才案例的执行过程,我们就得来分析分析,这一节我们主要讲解两个知识点: AOP工作流程和AOP核心概念。其中核心概念是对前面核心概念的补充。

1 AOP工作流程

由于AOP是基于Spring容器管理的bean做的增强,所以整个工作过程需要从Spring加载bean说起:

流程1:Spring容器启动

容器启动就需要去加载bean,哪些类需要被加载呢?需要被增强的类,如:BookServiceImpl通知类,如:MyAdvice注意此时bean对象还没有创建成功

流程2:读取所有切面配置中的切入点

上面这个例子中有两个切入点的配置,但是第一个ptx()并没有被使用,所以不会被读取。

流程3:初始化bean

判定bean对应的类中的方法是否匹配到任意切入点

注意第1步在容器启动的时候,bean对象还没有被创建成功。要被实例化bean对象的类中的方法和切入点进行匹配 匹配失败,创建原始对象,如UserDao 匹配失败说明不需要增强,直接调用原始对象的方法即可。 匹配成功,创建原始对象(目标对象)的代理对象,如: BookDao 匹配成功说明需要对其进行增强对哪个类做增强,这个类对应的对象就叫做目标对象因为要对目标对象进行功能增强,而采用的技术是动态代理,所以会为其创建一个代理对象最终运行的是代理对象的方法,在该方法中会对原始方法进行功能增强

流程4:获取bean执行方法

获取的bean是原始对象时,调用方法并执行,完成操作获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作验证容器中是否为代理对象

为了验证IOC容器中创建的对象和我们刚才所说的结论是否一致,首先先把结论理出来:

如果目标对象中的方法会被增强,那么容器中将存入的是目标对象的代理对象如果目标对象中的方法不被增强,那么容器中将存入的是目标对象本身。

验证思路

1.要执行的方法,不被定义的切入点包含,即不要增强,打印当前类的getClass()方法 2.要执行的方法,被定义的切入点包含,即要增强,打印出当前类的getClass()方法 3.观察两次打印的结果

步骤1:修改App类,获取类的类型

public class App {public static void main(String[] args) {ApplicationContext ctx = newAnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao = ctx.getBean(BookDao.class);System.out.println(bookDao);System.out.println(bookDao.getClass());}}

步骤2:修改MyAdvice类,不增强 因为定义的切入点中,被修改成update1 ,所以BookDao中的update方法在执行的时候,就不会被增 强,所以容器中的对象应该是目标对象本身。

@Component@Aspectpublic class MyAdvice {@Pointcut("execution(void com.itheima.dao.BookDao.update1())")private void pt(){}@Before("pt()")public void method(){System.out.println(System.currentTimeMillis());}}

步骤3:运行程序

步骤4:修改MyAdvice类,增强 因为定义的切入点中,被修改成update ,所以BookDao中的update方法在执行的时候,就会被增 强,所以容器中的对象应该是目标对象的代理对象

@Component@Aspectpublic class MyAdvice {@Pointcut("execution(void com.itheima.dao.BookDao.update())")private void pt(){}@Before("pt()")public void method(){System.out.println(System.currentTimeMillis());}}

步骤5:运行程序 至此对于刚才的结论,我们就得到了验证,这块大家需要注意的是: 不能直接打印对象,从上面两次结果中可以看出,直接打印对象走的是对象的toString方法,不管是不是代理对象打印的结果都是一样的,原因是内部对toString方法进行了重写。

2 AOP核心概念

在上面介绍AOP的工作流程中,我们提到了两个核心概念,分别是:

目标对象(Target):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的代理(Proxy):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现

上面这两个概念比较抽象,简单来说, 目标对象就是要增强的类[如:BookServiceImpl类]对应的对象,也叫原始对象,不能说它不能运 行,只能说它在运行的过程中对于要增强的内容是缺失的。

SpringAOP是在不改变原有设计(代码)的前提下对其进行增强的,它的底层采用的是代理模式实现 的,所以要对原始对象进行增强,就需要对原始对象创建代理对象,在代理对象中的方法把通知 [如:MyAdvice中的method方法]内容加进去,就实现了增强,这就是我们所说的代理(Proxy)。

小结

通过这一节中,我们需要掌握的内容有:

能说出AOP的工作流程AOP的核心概念 目标对象、连接点、切入点通知类、通知切面代理 SpringAOP的本质或者可以说底层实现是通过代理模式。
协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接