品Spring:SpringBoot和Spring到底有没有本质的不同?

现在的Spring相关开发都是基于SpringBoot的。 最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包。如下图:

使用java -jar命令就可以运行这个独立的jar包。如下图:

这个jar包的执行入口就是一个main函数,典型的格式如下:

@SpringBootApplication
public class TasteSpringApplication {
    public static void main(String[] args) {
        SpringApplication.run(TasteSpringApplication.class, args);
    }
}

其次又创建了这个WebServer,如下图:

接着又启动了这个WebServer,如下图:

最后又关闭和释放了这个WebServer,如下图:

由此证明了我们的猜想,确实有关于web服务器的“全套”操作。 现在SpringBoot翻身成了主人,它不仅可以启停web服务器,还可以选择web服务器,是用tomcat、jetty还是netty,都是可以配置的。爽吧。 Spring的核心就是IOC容器,容器所作的事情就是bean定义的注册,bean的实例化、初始化、依赖的装配,bean方法的调用,bean实例的销毁。 我们先来看看bean定义的注册吧。 首先看下传统Spring的,也就是AnnotationConfigWebApplicationContext这个类的。 先定义两个成员变量,存储要注册的类和要扫描的包,如下图:

然后又用两个类AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner来负责注册类和扫描包,如下图:

最后就是具体的来执行注册类和扫描包,如下图:

接着再看下SpringBoot的,也就是AnnotationConfigServletWebServerApplicationContext这个类的。 也是先定义两个成员变量,和上面的如出一辙,如下图:

也是用相同的两个类来负责处理,如下图:

编程新说注:实例化时虽然调用的构造函数不同,但是最终执行的却是相同的构造函数。 最终执行具体的处理也是相同的,如下图:

由此可以看出传统Spring和SpringBoot在对待bean定义注册这一块,完全相同,没有任何区别。 其实这很好理解,IOC容器这块内容在Spring中已经发展的相当成熟了,是不会再有人轻易去修改它了。 因此SpringBoot和Spring在本质上没什么差别,注意这里说的是本质。 由于SpringBoot的启动方式是把自身提前把web服务器移后(即采用内嵌web服务器),所以这块是额外新增的内容。 由于SpringBoot采用根据条件(condition)自动配置的方式(AutoConfiguration),所以这块也是额外新增的内容。 这两块都是额外新增的内容,和传统Spring基本没啥关系。 因此在SpringBoot和Spring重叠的部分,其实本质没啥区别。

(END)

>>> 品Spring系列文章 <<<

经验分享 程序员 微信小程序 职场和发展