治疗白癜风哪家医院 http://www.xxzywj.com/SpringBoot的启动,主要是通过实例化SpringApplication来启动的,启动过程,主要做了以下几件事情:配置属性、获取监听器,发布应用开始启动事件初、始化输入参数、配置环境,输出banner、创建上下文、预处理上下文、刷新上下文(加载tomcat容器)、再刷新上下文、发布应用已经启动事件、发布应用启动完成事件。
SpringApplication启动过程
在SpringBoot中启动tomcat的工作在刷新上下这一步。而tomcat的启动主要是实例化两个组件:Connector、Container,一个tomcat实例就是一个Server,一个Server包含多个Service,也就是多个应用程序,每个Service包含多个Connector和一个Container,而一个Container下又包含多个子容器。
ComponentScan
SpringBoot自动配置原理
SpringBoot项目的启动注解是:
SpringBootApplication,其实它就是由下面三个注解组成的:
Configuration
ComponentScanEnableAutoConfiguration
其中
EnableAutoConfiguration是实现自动配置的入口,该注解又通过Import注解导入了AutoConfigurationImportSelector,在该类中加载META-INF/spring.factories的配置信息。然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置功能!SpringBoot自动配置模块
无论是应用初始化还是具体的执行过程,都调用了SpringBoot自动配置模块。
该配置模块的主要使用到了SpringFactoriesLoader,即Spring工厂加载器,该对象提供了loadFactoryNames方法,入参为factoryClass和classLoader,即需要传入上图中的工厂类名称和对应的类加载器,方法会根据指定的classLoader,加载该类加器搜索路径下的指定文件,即spring.factories文件,传入的工厂类为接口,而文件中对应的类则是接口的实现类,或最终作为实现类,所以文件中一般为如下图这种一对多的类名集合,获取到这些实现类的类名后,loadFactoryNames方法返回类名集合,方法调用方得到这些集合后,再通过反射获取这些类的类对象、构造方法,最终生成实例。
工厂接口与其若干实现类接口名称
mybatis-spring-boot-starter、spring-boot-starter-web等组件的META-INF文件下,均含有spring.factories文件,自动配置模块中,SpringFactoriesLoader收集到文件中的类全名,并返回一个类全名的数组,返回的类全名通过反射被实例化,就形成了具体的工厂实例,工厂实例来生成组件具体需要的bean。
SpringBoot自动化配置关键组件关系图
SpringBoot、SpringMVC和Spring有区别:
Spring框架就像一个家族,有众多衍生产品例如boot、security、jpa等等;但他们的基础都是Spring的ioc和aop,ioc提供了依赖注入的容器,aop解决了面向切面编程,然后在此两者的基础上实现了其他延伸产品的高级功能。
SpringMVC提供了一种轻度耦合的方式,来开发web应用;它是Spring的一个模块,是一个web框架;通过DispatcherServlet,ModelAndView和ViewResolver,开发web应用变得很容易;解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。
SpringBoot实现了auto-configuration自动配置(另外三大神器actuator监控,cli命令行接口,starter依赖),降低了项目搭建的复杂度。它主要是为了解决,使用Spring框架,需要进行大量的配置,太麻烦的问题,所以它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合,用于提升Spring开发者体验的工具;同时它集成了大量常用的第三方库配置(例如Jackson,JDBC,Mongo,Redis,Mail等等),SpringBoot应用中,这些第三方库几乎可以零配置的开箱即用(out-of-the-box)。
解决SpringBoot中跨域问题:
现代浏览器出于安全的考虑,HTTP请求时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的,IP(域名)不同、或者端口不同、协议不同(比如HTTP、HTTPS)都会造成跨域问题。
一般前端的解决方案有:
跨域,可以在前端通过JSONP来解决,但是JSONP只可以发送GET请求,无法发送其他类型的请求。
使用JSONP来支持跨域的请求,JSONP实现跨域请求的原理简单的说,就是动态创建script标签,然后利用script的SRC不受同源策略约束来跨域获取数据,缺点是需要后端配合输出特定的返回信息。
利用反应代理的机制来解决跨域的问题,前端请求的时候先将请求发送到同源地址的后端,通过后端请求转发来避免跨域的访问。
后来HTML5支持了CORS协议。CORS是一个W3C标准,全称是”跨域资源共享”(Cross-originresourcesharing),允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
它通过服务器增加一个特殊的Header[Access-Control-Allow-Origin]来告诉客户端跨域的限制,如果浏览器支持CORS、并且判断Origin通过的话,就会允许XMLHttpRequest发起跨域请求。
前端使用了CORS协议,就需要后端设置支持非同源的请求,SpringBoot设置支持非同源的请求有两种方式。
设置支持非同源的请求有两种方式
SpringBootstarter作用:
依赖管理,是所有项目中至关重要的一部分。当一个项目变得相当复杂,管理依赖会成为一个噩梦,因为当中涉及太多artifacts了。
这时候SpringBootstarter就派上用处了。每一个stater都在扮演着提供我们所需的Spring特性的一站式商店角色,其他所需的依赖以一致的方式注入并且被管理。
所有的starter都归于org.springframework.boot组中,并且它们都以由spring-boot-starter-开头取名。这种命名方式使得我们更容易找到starter依赖,特别是当我们使用那些支持通过名字查找依赖的IDE当中。
目前已经有超过50个starter了,其中最常用的是:
spring-boot-starter:核心starter,包括自动化配置支持,日志以及YAML
spring-boot-starter-aop:SpringAOP和AspectJ相关的切面编程starter
spring-boot-starter-data-jpa:使用HibernateSpringDataJPA的starter
spring-boot-starter-jdbc:使用HikariCP连接池JDBC的starter
spring-boot-starter-security:使用SpringSecurity的starter
spring-boot-starter-test:SpringBoot测试相关的starter
spring-boot-starter-web:构建restful、springMVC的web应用程序的starter
用
EnableAutoConfiguration禁用某些自动配置特性:
如果我们想禁用某些自动配置特性,可以使用
EnableAutoConfiguration注解的exclude属性来指明。
SpringBoot的Actuator作用:
本质上,Actuator通过启用production-ready功能,使得SpringBoot应用程序,变得更有生命力。这些功能允许我们对生产环境中的应用程序进行监视和管理。
集成SpringBootActuator到项目中,非常简单。我们需要做的只是将spring-boot-starter-actuatorstarter引入到POM.xml文件当中:
artifactIdspring-boot-starter-actuator/artifactId
SpringBootActuaor可以使用HTTP或者JMXendpoints来浏览操作信息,大多数应用程序都是用HTTP,作为endpoint的标识以及使用/actuator前缀作为URL路径。
这里有一些常用的内置endpointsActuator:
auditevents:查看audit事件信息
env:查看环境变量
health:查看应用程序健康信息