文章目录
前言
体能状态先于精神状态,习惯先于决心,聚焦先于喜好
通过断点查看单例状态下的 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默认的动态代理方式了
本文通过断点调试深入探讨了Spring框架下Bean的三种存在形式:普通对象、JDK动态代理对象及CGLIB动态代理对象。揭示了AOP功能如何影响Bean的状态,并解析了JDK动态代理与CGLIB动态代理的应用场景与性能差异。
168万+

被折叠的 条评论
为什么被折叠?



