0.5、Spring源码学习 ——Spring bean 的存在形式和 Spring AOP 的应用规律

本文通过断点调试深入探讨了Spring框架下Bean的三种存在形式:普通对象、JDK动态代理对象及CGLIB动态代理对象。揭示了AOP功能如何影响Bean的状态,并解析了JDK动态代理与CGLIB动态代理的应用场景与性能差异。

前言

体能状态先于精神状态,习惯先于决心,聚焦先于喜好

通过断点查看单例状态下的 Spring bean 在 上下文中的形态

默认情况下,Spring bean 是单例的,也就是说,Spring 容器在初始化阶段会为每个Spring bean 创建一个对象,然后将之放到上下文中供我们的程序访问
通过IOC(控制反转,又叫依赖注入)的方式,Spring 会在我们调用相应的Spring bean 时自动将对象注入进去
但是呢,由于Spring 为我们提供来AOP 功能,而这一功能是通过动态代理方式实现的,所以Spring 上下文中的 bean 也可能以代理对象的形式存在,加之Spring AOP 可以通过 JDK动态代理,也可能通过 cglib 动态代理来实现,所以实际上 Sping 上下文中的bean一共有三种形态 普通对象、jdk动态代理对象、cglib动态代理对象
下面笔者将通过断点的方式,分别查看 三种形态的Spring bean

断点的位置和测试技巧
  • 断点位置

org.springframework.context.support.AbstractApplicationContext.getBean(String name)
的 return getBeanFactory().getBean(name); 这一行

  • 测试技巧

你可以通过快捷键获取 getBeanFactory() 的断点信息,
或者在IDE中也提供了这样的视窗,如eclipse中 Variables-this-beanfactory-singletonObjects 然后一个一个查看就行了

对Spring bean 三种形态对截图

通过不同的配置,查看断点信息(his-beanfactory-singletonObjects)可以看到不同的断点的形态

  • 普通对象-不开启AOP
    在这里插入图片描述

  • 开启AOP-jdk动态代理对象
    在这里插入图片描述

  • 开启AOP-cglib动态代理对象
    在这里插入图片描述

Spring AOP 什么时候使用JDK动态代理,什么时候是cglib动态代理?
自己动手感受jdk动态代理和cglib动态代理

简答来说 jdk动态代理是 jdk自身提供的代理机制,其有一个前提,被代理的类必须实现一个接口;cglib代理则可以直接对一个类进行代理
从性能来说,早起cglib性能要高一些,但是目前jdk动态代理对性能已经很OK了,否则这样不会成为Spring默认的动态代理方式了

JDK动态代理和CGLIB动态代理举例

Spring AOP 动态代理的配置和规律

请参考 Spring AOP的使用规律和测试代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值