当用户发送请求 咱这个项目是怎么个流程呢?
- http的三次握手----?四次挥手?
三次握手 :
1.客户端发起一个要创建连接的数据包(SYN/seq)的请求发送给服务器
2.服务器端接收到客户端的请求,返回一个SYN/ACK 标志的数据包,其中ACK就是客户端发送Seq+1,而且再次发送一个服务端的Seq。
3.客户端接收到服务端发送的请求,表明允许连接了,再次向服务端发送数据确认可以接收到的数据,发送ACK等于上一步返回的Seq+1.以及新的数据Seq
- 为什么要三次握手?
就是为了防止服务端开启一些无用的连接(毕竟网络连接是有延迟的)需要三次握手来确定客户端于服务器端保持连接以及发送数据成功
- 四次挥手又是个什么玩意?
1.Client向Server发送Fin包,表示Client主动要关闭连接,而且进入FIN_WAIT_1状态,等待Server返回Ack包。此后Client不能向Server发送数据,但是能读取数据
2.Server接收FIN包后向Cient发送ACK包,然后进入Close_WAIT状态,此后Server不能读取数据了,但是可以想Client发送数据
3.Client接收Server返回的ACk包后进入Fin_WAIT_2状态,等待Server发送FIN包
4.Server完成数据的发送后,将FIn包发送给Client,然后进入LAST_ACK状态,等待Client返回ACK包,此后Server不能读取数据,也不能发送数据
5.Client接收Fin包后想Server发送ACK包,然后进入Time_WAIT状态,接着等待足够长的时间(2MSL)确保Server接收ACK包,最后回到CLOSED窗台,释放网络资源
为什么要四次挥手呢?
因为TCP是全双工信通道,就是客户端于服务端建立两条通道。
1.客户端对服务端说,老子要关闭输入通道了,服务端说,行,你关吧,我这边也关闭这个通道。
2.服务端对着客户端说,你关了这个通道了,该我了,我也要关闭这个输入通道了。客户端说,行吧,你关吧,我把这个通道关闭。
这里是引用
Spring源码解析
项目启动 自动装配源码流程
- 主方法的上面的@SpringBootApplication中底层使用了@EnableAutoConfiguration注解 这个注解呢 底层使用了import({AutoConfigurationImportSelector.class}) 也就是导入了这个AutoConfigurationImportSelector这个类的被引用接口列表的第一个接口,这个接口中有一个方法selectImports(),这个是把组件导入到容器中。
- selectImports()(这个方法是一个String[])这个方法 它底层调用了getAutoConfigurationEntry()这个方法,getAutoConfigurationEntry()这个方法有一个List集合列表。 他是被一个方法调用得到的返回值,方法名字为getCandidateConfigurations(),这个getCandidateConfigurations()方法内部调用了工具类,SpringFactoriesLoader,使用工具类的静态方法loadFactoryNames()获取所有jar包下的META-INF/spring.factories
- loadFactorynames()调用了,他的返回值会调用一个loadSpringFactories()方法,这个方法会把这个文件内容包装成一个Properites对象从Properites对象中获取到EnableConfigutrion.class对应的值,把她们放在容器中
- 自动装配
当一个类被自动装配后,他类上方有
@configuration注解,这个注解代表的是这个是一个配置类。
@EnableConfigurationProperties({xxx.class})启动指定类的ConfigurationProperties功能,也就是xxx类的@ConfigurationProperties
(prefix="")从Properties中获取这个对象 且注入进去
客户端发送请求------http://localhost:8080/项目名字/接口请求
- 1.浏览器 先将域名转为ip地址(第一步,在计算机本地的hosts文件中找域名对应的ip 如果没有找到的话,那就去dns服务器中去找。将对应的域名装为ip地址)
- 2.获取ip地址后,就能找到网络中的具体计算机了,然后根据端口号,找到对应计算机的对应端口号的程序 也就是Tomcat 这时候Tomcat启动
- 3.Tomcat启动后会根据Tomcat的部署文件进行部署,也就是进入项目文件中
- 4.进入项目文件中会找到web.xml(Spring-MVC)创建一个Spring容器或者是启动主方法(Spring-boot)直接创建一个Spring容器。
- 5.创建完Spring容器之后会根据web.xml配置文件中的Spring-mvc.xml的路径找到这个xml文件,且找到需要进行注解扫描的包(SpringMVC)找到@Controller注解或者什么@Bean注解 @Service @Component等,把这些类new一个对象 放在Spring容器中 这个Spring容器其实就是一个Map集合,他的key就是Bean的名字,他的value就是Bean的对象
- -------如何放在SPring容器中的呢?Spring底层是把每一个元素分别转换为一个BeanDefinition对象,其中保存了从配置文件中读取到该Bean的各种信息,然后通过BeanFactory对Bean进行注册,等到我们用的时候,直接对着Bean工厂也就是BeanFactory给一个类型,这个工厂直接返回一个Bean对象,当然,这种情况是属于单例Bean
- 6.Spring容器中有对象了,然后我们在使用,如何使用?使用依赖注入(针对的类的一个特定属性,所以是一次操作(一个)),或者 是自动装配(针对的是一个类下的所有属性(所以可能是多个),所以是一次批量操作(多个))
- 7.Bean的初始化前(@PostConstrut) 初始化(Initinlizing接口) 初始化后(AOP)如果使用Aop的话 会使用代理设计模式 生成一个代理对象 ,这个代理对象就是一个普通对象,他底层是通过继承普通对象 ,且实现普通对象的方法,但是代理对象中有一targrt属性 ,这个target属性是Bean对象(有数据的对象)
AOP:面向切面 —面对交叉逻辑的情况,把一个东西封装成一个切面,直接注入到对象中,使这个对象或者方法增强 但是 只能是Public
权限:Public 所有类可见 protected 对子类可见 对本类可见 private 对本类可见 - 8.Bean初始化完毕,Spring会使用适配器进行适配,适配出@Controoller
这个@Controller对象会根据路由上的地址进行查找 ,底层是通过反射,循环便利这个方法,且看一看他有没有这个注解,有的话,查看这个注解的参数值与路由对不对应,对应的话,直接运行这个方法。 - 9.运行这个方法,会返回一个ModelAndView对象,或者是直接返回给前端一个JSON值,如果是ModelAndView对象会给试图解析器,试图解析器会根据这个对象返回一个试图 也就是view给前端控制器,前端控制对其进行渲染,且传给前端做响应
Spring SpringMvc SpringBoot有什么区别?
Spring:他是一个IoC容器 他是通过控制反转进行依赖注入,使代码耦合性降低,他是一个胶水型框架,他是一个IOC容器
SpringMvc:他是一个SPring的进行web开发的一种方案,M指的是数据模型,V指的是用户界面 C是控制器。他的目的即使实现代码分离。
SpringBoot:他是一个开发工具包,他里面内嵌了tomcat ,还有什么Mysql。redis。mongodb。他没有xml文件 只需要在一个yml文件中就可以进行配置。SpringBoot====SPring+SpringMvc
SpringMvc的运行流程
用户发送请求,前端控制器接收请求,调用处理器映射器,找到具体的处理器,生成处理器与拦截器(如果有的话)一并返回给前端控制器,前端控制器调用处理器适配器,适配调用合适的处理器Controller,Controller返回一个ModelAndView对象,处理器适配器把这个对象返回给前端控制器,前端控制器接收这个对象且传给试图解析器,试图解析器根据这个对象返回view,且返回给前端控制器,前端控制器渲染view,响应给客户端