【Java】spring boot源码分析问题,关于Java强转

我是在学习Java的小白,Java的多态我了解了,在源码中运用非常多,但是这个强转还是不懂,一百度,前十页都是聊类型转换的,醉人。

举个例子

【Java】spring boot源码分析问题,关于Java强转

上图是在spring boot启动方法中,前面执行了context = createApplicationContext();已经创建了context了,在我图片的刷新context中传递了context,好,继续

【Java】spring boot源码分析问题,关于Java强转

可以看到这个刷新方法中对context做了强转,使用了AbstractApplicationContext类型

疑问在这里,下面的两个截图都是AbstractApplicationContext抽象类中的方法

【Java】spring boot源码分析问题,关于Java强转

【Java】spring boot源码分析问题,关于Java强转

getBeanFactory是抽象方法,被AbstractApplicationContext抽象类调用,最后要去访问的是它的实现吧,实现是在GenericApplicationContext中

【Java】spring boot源码分析问题,关于Java强转

context由于是spring boot启动的,此时的context是AnnotationConfigServletWebServerApplicationContext

关系图

【Java】spring boot源码分析问题,关于Java强转

从这个继承关系来看,感觉是有这么点多态的意思,还是有点晕,((AbstractApplicationContext) applicationContext).refresh(); 为什么可以这样用呢,这就是强转吗,说不上来的感觉,或许我对多态理解不深入?

关系图我再传个关键点部分的截图
【Java】spring boot源码分析问题,关于Java强转

有大佬路过可以发表下自己的理解

回答

因为在转换时,前面已经用了 Assert.isInstanceOf() 进行断言了,如果是 AbstractApplicationContext 才会进行转换。

SpringBoot本意是想调用refresh()方法对配置上下文进行刷新操作,但refresh()不是ApplicationContext中的方法,而是ConfigurableApplicationContext中的方法。实际这里强转ConfigurableApplicationContext也行。而AbstractApplicationContext实现了ConfigurableApplicationContext,所以调用refresh()方法时先进行了强转。并且前面有Assert进行了一次断言。

以上是 【Java】spring boot源码分析问题,关于Java强转 的全部内容, 来源链接: utcz.com/a/87554.html

回到顶部