SpringIOC容器为什么不使用Class.forName加载类

Spring IOC容器为什么不使用Class.forName加载类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

成都创新互联公司专注于商河企业网站建设,自适应网站建设,成都商城网站开发。商河网站建设公司,为商河等地区提供建站服务。全流程按需网站策划,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务

今天我们要学习的Spring IOC 容器为什么不使用 Class.forName 加载类,而是使用 ClassLoader!

Spring IOC容器为什么不使用Class.forName加载类

虽然 Class.forName() 和 ClassLoader 都可用来对类进行加载,但是它们还是有些区别的。为了说明它们,我们来看看 JVM 加载类的步骤是什么!

Spring IOC容器为什么不使用Class.forName加载类

Spring IOC容器为什么不使用Class.forName加载类

清楚上面这个之后,再要想搞明白 Spring Ioc中为什么使用 Classloader,而不是 Class.forName,还得从它们的区别说起。我们先来看看如果使用 Class.forName 会发生什么!

先创建一个测试类。

Spring IOC容器为什么不使用Class.forName加载类

上面的代码中, Class.forName("com.xttblog.Xttblog") 的调用会触发 Xttblog 的静态代码块的执行, 而 ClassLoader.getSystemClassLoader().loadClass("com.xttblog.Xttblog") 并不会。

调用 Class.forName 其实相当于调用了 Class.forName(className, true, currentLoader), 这个方法的第二个参数表示是否需要初始化类。源码中设置为 true, 因此 Class.forName 获取到 Class 对象时, 会自动对类进行初始化的。并且 Class.forName 加载类的 ClassLoader 和调用 Class.forName 所在的类的 ClassLoader 相同。上面的代码中, Class.forName("com.xttblog.Xttblog") 的调用会触发 Xttblog 的静态代码块的执行, 而 ClassLoader.getSystemClassLoader().loadClass("com.xttblog.Xttblog") 并不会。

我们知道 Spring 的 IOC 中有一个懒加载(延迟加载),如果你使用了 Class.forName,那么懒加载这个功能就无法实现了。Spring IoC 为了加快初始化速度,因此大量使用了延时加载技术。而使用 classloader 不需要执行类中的初始化代码,可以加快加载速度,把类的初始化工作留到实际使用到这个类的时候。

所以,Spring IOC 容器并没有采用 Class.forName 来加载类。

看完上述内容,你们掌握Spring IOC容器为什么不使用Class.forName加载类的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!

网站栏目:SpringIOC容器为什么不使用Class.forName加载类
分享地址:https://www.cdcxhl.com/article42/iipdhc.html

成都网站建设公司_创新互联,为您提供品牌网站建设外贸网站建设小程序开发网站设计定制开发面包屑导航

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

外贸网站建设