文章目录
- 1、SpringBoot和Spring的区别
- 2、SpringBoot核心设计思想
- 3、`@SpringBootApplication`注解分析
- 4、SpringBoot项目启动步骤
- 5、DispatcherServlet
- 6、关于静态资源
1、SpringBoot和Spring的区别
答:SpringBoot来自于Spring家族,所以Spring所具备的功能和优点,SpringBoot同样具有
SpringBoot简化了基于Spring的应用开发,只通过少量的代码就能快速构建一个Spring应用
SpringBoot只需要很少的配置就可以完成项目开发,自动进行Spring框架的配置
SpringBoot可以通过场景启动器(starter)自行维护所需依赖
SpringBoot直接嵌入Servlet容器,在开发和部署的时候无需安装相关Web容器,调试方便
SpringBoot的应用场景非常广泛,包括web、微服务等
2、SpringBoot核心设计思想
约定大于配置
例:如果在数据库中有一张名称为tb_mall_user的表,那么可能在项目中就对应有一个名称为MallUser的实体类
约定大于配置并不是说不需要配置,它其实是一种开发原则,目的是在一定限度内减少需要开发人员手动配置的工作量,用默认的配置达到开发人员的需求。
例:在项目中加入spring-boot-starter-web
后,Spring Boot会自动导入Spring MVC的相关依赖和一个内置的Tomcat容器。在这里就有”约定大于配置”的理念。在导入spring-boot-starter-web
后,就表示开发人员与SpringBoot之间约定当前项目是一个Web项目。既然是Web项目,又进一步约定开发人员会使用Spring MVC,从而自动装配DispatchServlet到IOC容器中。
同理,开发人员在项目中加入jdbc-stater之后,就表示开发人员与SpringBoot之间约定会对数据库进行操作,SpringBoot会自动导入JDBC相关的依赖并配置一个数据源对象供开发人员调用
这些自动化配置类在类路径META-INF/spring.factories文件中,它通过@EnableAutoConfiguration注解加载到容器中并发挥作用
SpringBoot为开发人员设置了默认编码、默认JDK版本及Maven编译的默认设置,同时维护了一套项目依赖的配置,相关依赖可以导入,并不需要声明其版本号
SpringBoot的场景启动器默认已经维护好了在该场景中所需的jar包,导入场景启动器即可进行该场景的功能开发
3、@SpringBootApplication
注解分析
与普通的Spring项目相比,二者的区别在@SpringBootApplication
注解和启动方法SpringApplication.run()
上。因为未使用SpringBoot开发的Java Web项目既没有@SpringBootApplication
注解也没有启动方法
@SpringBootApplication
注解的含义:如果Application标注在某个类上说明这个类是Spring Boot的主配置类,Spring Boot会运行这个类的main方法来启动SpringBoot应用
@SpringBootApplication
注解是一个复合注解,其中前面四个注解是Java元注解
重要的是后面三个注解
@SpringBootConfiguration
:SpringBoot配置注解
@EnableAutoConfiguration
:启动自动配置注解
@ComponentScan
:组件自动扫描
@SpringBootConfiguration
注解:类上声明了一个@Configuration
注解,主要用于定义配置类,替代XML配置文件
@SpringBootConfiguration
注解仅仅是对@Configuration
注解进行了包装
@EnableAutoConfiguration
注解表示开启自动配置功能。除Java元注解之外,这个注解最重要的就是@AutoConfigurationPackage
注解和使用@Import
注解引入的AutoConfigurationImportSelector组件
AutoConfigurationPackage
注解中包含Spring框架的@Import
注解,其作用就是将标注了该注解的组件注册到Spring的IOC容器中,而导入的内容则由AutoConfigurationPackages.Registrar.class类指定。也就是说SpringBoot会注册自动配置包的名称,默认为当前主程序类所在的包及其子包。这些包中的组件会被加载到容器中。需要注意的是,加载到其他包中的组件默认是不会扫描的
@ComponentScan
注解
在@Controller、@Service、@Repository
等注解的定义上都会标注一个共同的注解@Component
。而在Spring IOC容器中@Controller、@Service、@Repository、@Component
等注解的默认装配标识是@ComponentScan
注解
在普通的Spring项目开发中,一般会在Spring配置文件中编写如下配置,将对应包下的所有组件扫描并注册到容器中:
<!-- 自动扫描 -->
<context:component-scan base-package="com.ssm.demo.dao"/>
<context:component-scan base-package="com.ssm.demo.service"/>
<context:component-scan base-package="com.ssm.demo.controller"/>
使用注解的方式与这种XML配置文件的方式所实现的效果是相同的,@ComponentScan
注解的作用就是让Spring容器从对应包下获取需要注册的类。开发人员通过注解来定义哪些包需要被自动扫描并装配。一旦指定了相应的包名,Spring将会在被指定的包及其子包中寻找标注了以上注解的Bean并注册到容器中
4、SpringBoot项目启动步骤
(1)实例化SpringApplication
对象
(2)开始执行run()方法,代码执行时间的监控开启,在Spring Boot应用启动成功后会打印启动时间
(3)配置headless属性,java.awt.headless
是J2SE的一种模式,用于在缺失显示屏、鼠标或者键盘时的系统配置,默认为true。通俗而言,该行代码的作用是Spring Boot应用在启动时,没有检测到显示器也能够继续执行后面的步骤
(4)获取SpringApplicationRunListeners
5)回调SpringApplicationRunListener
对象的starting()
方法
(6)解析run()方法的args参数并封装为DefaultApplicationArguments
类
(7)prepareEnvironment()方法的作用与它的方法名的含义相同,就是为当前应用准备一个Environment对象,也就是运行环境,它主要完成对ConfigurableEnvironment
的初始化工作
(8)设置系统参数,configureIgnoreBeanInfo()
方法
(9)获取需要打印的SpringBoot启动Banner对象
(10)创建Spring容器ApplicationContext
(11)准备ApplicationContext实例
在创建对应的Spring容器后,程序会进行初始化、加载主启动类等预处理工作,至此,主启动类加载完成,容器准备好
(12)刷新容器
(13)调用afterRefresh()方法,执行Spring容器初始化的后置逻辑,默认实现是一个空的方法
(14)代码执行时间的监控停止,即知道了启动应用所花费的时间
(15)发布容器启动事件
(16)在ApplicationContext完成启动后,程序会对ApplicationRunner和CommandLineRunner进行回调处理,查找当前ApplcationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们
另外,在SpringApplication启动过程中,如果出现问题会由异常处理器接管,并对异常进行处理
从代码上讲,一个Spring容器就是某个实现了ApplicationContext接口的类的实例,也就是说,从代码层面,Spring容器其实就是一个ApplicationContext(一个实例化对象)
5、DispatcherServlet
DispatcherServlet执行流程
首先,用户发起请求,请求到达前端控制器DispatcherServlet,前端控制器再根据用户的URL请求调用处理器映射器查找匹配该URL的Handler,并返回一个执行链。然后,处理器适配器调用相应的Handler进行业务处理并返回给前端控制器一个ModelAndView对象。前端控制器再请求视图解析器将返回的逻辑视图进行解析。最后前端控制器将返回的视图进行渲染,并把数据封装到Request域中返回给用户
6、关于静态资源
SpringBoot默认的静态资源处理目录为:”classpath:/META-INF/resources/"、“classpath:/resources/"、“classpath:/static/”、”classpath:/public/"
由于访问当前项目的任何资源都能在静态资源的文件夹中查找,而不存在的资源则会显示相应的错误页面,因此在开发Web项目时只需要包含这几个目录中的任意一个或者多个,并将静态资源文件放入其中即可
开发时也可以在Spring Boot项目配置文件中修改这些属性。比如将拦截路径改为“/static/",并将静态资源目录修改为"/file-test",那么默认配置就会失效并使用开发人员自定义的配置。修改application.properties
文件,添加如下配置:
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/file-test/
在进行WebMVC自动配置时程序会向IOC容器注册一个WelcomePageHandlerMapping类型的Bean。即默认欢迎页。其路径为静态资源目录下的index.html