Springboo零配置原理

1、一个web程序怎么跑起来?

当客户端(可以是浏览器、也可以是postman等工具)发送请求给服务器后,服务器会调用并执行对应的逻辑代码进行请求处理。逻辑代码是由程序员自己编写然后放进服务器进行运行,然后讲运行后的结果返回给客户端。

Springboo零配置原理_第1张图片

而他们之间的交互规则一般是由http协议来实现的:

Springboo零配置原理_第2张图片

当然为为了在网络中找到后端服务器需要执行的代码需要做些什么呢?

1、在网络中找到后端服务器:而这个过程依赖于DNS服务,而DNS服务是互联网的核心

DNS是域名系统(Domain Name System)的缩写,是一种组织域层次结构的计算机和网络服务命名系统。当用户在应用程序中输入DNS名称时,DNS服务可以将此名称解析为与此名称相关的IP地址信息。用户在使用网络服务时喜欢在浏览器的地址栏中输入使用主机名和域名组成的名称,如computer.myblog.com,因为这样的名称更容易被用户记住。但是,计算机在网络上是使用IP地址来通信的。为了能够实现网络计算机之间通信,DNS服务器所提供的服务就是将用户所使用的计算机或服务名称映射为IP地址。

Springboo零配置原理_第3张图片

2、servlet原理和tomcat原理

那么如何告诉这台服务器我想执行哪里的java代码?

在本地我们直接运行main方法即可启动程序执行java代码,但是在web应用中我们不可能每次来个请求,我都去点一下main方法去执行相应的代码。

所以需要些一个写一个根据用户请求来调用相应逻辑代码的容器(对象),执行完相应逻辑后,java主线程并没有结束,而是在那里等待用户请求。这个容器就叫做服务器,每个请求的过程就是把程序员自己些的代码放入这个服务器执行并相应的过程。可是这个容器要能跑java代码的话,那也就必须要按照jvm规范去实现。那么服务器又如何知道去应该调用那个类和哪个方法来处呢?也就是服务器怎么才能认识程序员执行的代码。由于java的多态的性质,程序员写的代码只要和服务器共同实现一个接口,

只要将程序员写的这个对象传入服务器,就可以直接执行这个代码。而这个技术就叫Servlet,只要程序员都请求都去实现servlet接口,请求的时候传给服务器容器,就去找这个实例对象中的一个service方法,去执行。而tomcat服务器就是一种这样的服务器实现。

Springboo零配置原理_第4张图片

 

当浏览器发送请求给服务器后,服务器会调用并执行对应的逻辑代码进行请求处理。逻辑代码是由程序员自己编写然后放进服务器进行运行,其实就是 Servlet程序。狭义的 Servlet 是指 Java 语言实现的一个接口;广义的 Servlet 是指任何实现了这个 Servlet 接口的类,一般情况下,人们将 Servlet 理解为后者。Servlet 运行于支持 Java 的应用服务器中。从原理上讲,Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP 协议的 Web 服务器。

servlet的使用:

Springboo零配置原理_第5张图片

3、为什么springboot可以使用jar包直接部署?

在刚进公司的时候,我很疑惑为什么程序直接个jar包就直接扔到docker容器上运行了,容器上好像也没有tomcat服务器。

因为web项目不是应该打war包后,再放入tomcat容器中运行吗?这不符合常识。

让我们看看网上是怎么说的?

war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块。而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运行的.
它们都是压缩的包,拿Tomcat来说,将war文件包放置它的\webapps\目录下,启动Tomcat,这个包可以自动进行解压,也就是你的web目录,相当于发布了。
war包:是做好一个web应用后,通常是网站,打成包部署到容器中。
jar包:通常是开发时要引用通用类,打成包便于存放管理。
ear包:企业级应用,通常是EJB打成ear包。
所有的包都是用jar打的,只不过目标文件的扩展名不一样。
WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含有Html和Jsp文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录,这个目录很重要。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类(如JavaBean)。通常这些所依赖的类也可以打包成JAR放到WEB-INF下的lib目录下,当然也可以放到系统的CLASSPATH中,但那样移植和管理起来不方便。

那我们明白了jar包是可以直接运行的,而war包得借助于tomcat容器才可以运行。

好了springboot干了件什么事情呢?

内置了tomcat容器。tomcat容器说白了也就是个.exe文件,我直接放在我代码中去启动可以吗?当然可以。

4、springboot为什么可以零配置?

 分析SpringBoot如何省去web.xml还得从Servlet3.0的规范说起:

ServletContainerInitializer类通过jar services API查找。对于每一个应用,应用启动时,由容器创建一个ServletContainerInitializer 实例。 框架提供的ServletContainerInitializer实现必须绑定在 jar 包 的META-INF/services 目录中的一个叫做 javax.servlet.ServletContainerInitializer 的文件,根据 jar services API,指定 ServletContainerInitializer 的实现。除 ServletContainerInitializer 外,我们还有一个注解@HandlesTypes。在 ServletContainerInitializer 实现上的@HandlesTypes注解用于表示感兴趣的一些类,它们可能指定了 HandlesTypes 的 value 中的注解(类型、方法或自动级别的注解),或者是其类型的超类继承/实现了这些类之一。无论是否设置了 metadata-complete,@HandlesTypes 注解将应用。当检测一个应用的类看是否它们匹配 ServletContainerInitializer 的 HandlesTypes 指定的条件时,如果应用的一个或多个可选的 JAR 包缺失,容器可能遇到类装载问题。由于容器不能决定是否这些类型的类装载失败将阻止应用正常工作,它必须忽略它们,同时也提供一个将记录它们的配置选项。如果ServletContainerInitializer 实现没有@HandlesTypes 注解,或如果没有匹配任何指定的@HandlesType,那么它会为每个应用使用 null 值的集合调用一次。这将允许 initializer 基于应用中可用的资源决定是否需要初始化 Servlet/Filter。在任何 Servlet Listener 的事件被触发之前,当应用正在启动时,ServletContainerInitializer 的 onStartup 方法将被调用。ServletContainerInitializer’s 的onStartup 得到一个类的 Set,其或者继承/实现 initializer 表示感兴趣的类,或者它是使用指定在@HandlesTypes 注解中的任意类注解的。

 这个规范如何理解呢?

  简单来说,当实现了Servlet3.0规范的容器(比如tomcat7及以上版本)启动时,通过SPI扩展机制自动扫描所有已添加的jar包下的META-INF/services/javax.servlet.ServletContainerInitializer中指定的全路径的类,并实例化该类,然后回调META-INF/services/javax.servlet.ServletContainerInitializer文件中指定的ServletContainerInitializer的实现类的onStartup方法。 如果该类存在@HandlesTypes注解,并且在@HandlesTypes注解中指定了我们感兴趣的类,所有实现了这个类的onStartup方法将会被调用。

  再直白一点来说,存在web.xml的时候,Servlet容器会根据web.xml中的配置初始化我们的jar包(也可以说web.xml是我们的jar包和Servlet联系的中介)。而在Servlet3.0容器初始化时会调用jar包META-INF/services/javax.servlet.ServletContainerInitializer中指定的类的实现(javax.servlet.ServletContainerInitializer中的实现替代了web.xml的作用,而所谓的在@HandlesTypes注解中指定的感兴趣的类,可以理解为具体实现了web.xml的功能,当然也可以有其他的用途)。

具体可参考此文:https://www.cnblogs.com/hello-shf/p/10926271.html

Springboo零配置原理_第6张图片

第一:web.xml

Springboo零配置原理_第7张图片

Springboo零配置原理_第8张图片

那么只要能够自动去扫描类,初始化spring容器,自动注册severlet就可以省掉web.xml了。

去看看这篇文章,你会理解的

https://blog.csdn.net/qq_32099833/article/details/103543970?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1&spm=1001.2101.3001.4242

未完待续。。。

 

 

你可能感兴趣的:(微服务)