SpringBoot系列

/ 语言 / 2 条评论 / 2446浏览

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

-----------------来自小马哥的故事

SpringBoot系列-1入门

相关介绍

官网:https://projects.spring.io/spring-boot

官方应用: SpringBoot->SpringCloud>微服务

Spring Boot不是一门新技术。从本质上来说,Spring Boot就是Spring,它做了那些没有它你也会去做的Spring Bean配置。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来。使用Spring Boot很容易创建一个独立运行(运行jar,内嵌Servlet容器)、准生产级别的基于Spring框架的项目,使用Spring Boot基本上可以不用或者只需要很少的Spring配置

SpringBoot精要

SpringBoot是伴随着Spring4.0诞生的

SpringBoot帮助开发者快速启动一个Web容器

SpringBoot继承了原有Spring框架的优秀基因

SpringBoot简化了使用Spring的过程

自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置

起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。

命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建。

Actuator:让你能够深入运行中的Spring Boot应用程序,探测各种指标。

springboot使开发更简单

springboot使配置更简单

功能的组合配置:

从XML config -> Java config
Bean  注入   ->  Autowire

部署环境配置:

从多个 *peoperties  -> 单个 Application.yml(或者properties)

springboot使监控更简单:

spring-boot-actuator:

/configpros            查看属性配置
/dump                    线程工作状态
/env/{name}           环境变量
/metrics/{name}     JVM性能指标
/mappings       RestFul Path 与服务类的映射关系

springboot使服务化开发更简单:

多个client >>> 通过Api接口 <<< Rest API>>> 多个Springboot SPI

系统要求

目前Spring Boot最新正式版为1.5.8.RELEASE

默认情况下,Spring Boot 1.5.X.RELEASE需要Java 7和Spring Framework 4.3以上或更高版本,我们可以使用Spring Boot with Java 6和一些额外的配置(不建议),使用Maven(3.2+)或Gradle 2(2.9或更高版本)和3来构建。

大家可以使用Java 6或7的Spring Boot,通常推荐Java 8。 本次统一使用Java 1.8,Spring Boot 1.5.1.RELEASE以及Maven3.3.9版本。开发工具使用STS

快速入门

传统Spring MVC开发一个简单的Hello World Web应用程序,你应该做什么?

一个项目结构,其中有一个包含必要依赖的Maven或者Gradle构建文件,最起码要有Spring MVC和Servlet API这些依赖。

一个web.xml文件(或者一个WebApplicationInitializer实现),其中声明了Spring的DispatcherServlet。

一个启动了Spring MVC的Spring配置

一控制器类,以“hello World”相应HTTP请求。

一个用于部署应用程序的Web应用服务器,比如Tomcat。

最让人难以接受的是,这份清单里面只有一个东西是和Hello World功能相关的,即控制器,剩下的都是Spring开发的Web应用程序必需的通用模板。

接下来看看Spring Boot如何搞定? 很简单,我仅仅只需要非常少的几个配置就可以迅速方便的搭建起来一套web项目

SpringBoot系列-2配置

Spring Boot使用了一个全局的配置文件application.properties,放在src/main/resources目录下或者类路径的/config下。Sping Boot的全局配置文件的作用是对一些默认配置的配置值进行修改。

1、自定义属性

2、参数引用

3、引用自定义配置文件

4、配置随机值

5、内置属性配置

配置文件加载优先级

application.properties和application.yml文件可以放在一下四个位置:

外置:在相对于应用程序运行目录的/congfig子目录里。

外置:在应用程序运行的目录里

内置:在config包内

内置:在Classpath根目录

同样,这个列表按照优先级排序,也就是说,src/main/resources/config下application.properties覆盖src/main/resources下application.properties中相同的属性

如果你在相同优先级位置同时有application.properties和application.yml,那么application.yml里面的属性就会覆盖application.properties里的属性。

Profile-多环境配置

当应用程序需要部署到不同运行环境时,一些配置细节通常会有所不同,最简单的比如日志,生产日志会将日志级别设置为WARN或更高级别,并将日志写入日志文件,而开发的时候需要日志级别为DEBUG,日志输出到控制台即可。

如果按照以前的做法,就是每次发布的时候替换掉配置文件,这样太麻烦了,Spring Boot的Profile就给我们提供了解决方案,命令带上参数就搞定。

在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:

application-dev.properties:开发环境
application-prod.properties:生产环境

想要使用对应的环境,只需要在application.properties中使用spring.profiles.active属性来设置,值对应上面提到的{profile},这里就是指dev、prod这2个。

或者用命令行启动的时候带上参数: java -jar xxx.jar --spring.profiles.active=dev

SpringBoot系列-3启动解析

1、@SpringBootApplication 2、SpringBootApplication.run()

SpringBoot执行流程

SpringApplication的run方法的实现程序运行的主要线路,该方法的主要流程大体可以归纳如下:

1) 如果我们使用的是SpringApplication的静态run方法,那么,这个方法里面首先要创建一个SpringApplication对象实例,然后调用这个创建好的SpringApplication的实例方法。在SpringApplication实例初始化的时候,它会提前做几件事情: 根据classpath里面是否存在某个特征类(org.springframework.web.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为Web应用使用的ApplicationContext类型。 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer。 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener。 推断并设置main方法的定义类。

2) SpringApplication实例初始化完成并且完成设置后,就开始执行run方法的逻辑了,方法执行伊始,首先遍历执行所有通过SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener。调用它们的started()方法,告诉这些SpringApplicationRunListener,“嘿,SpringBoot应用要开始执行咯!”。

3) 创建并配置当前Spring Boot应用将要使用的Environment(包括配置要使用的PropertySource以及Profile)。

4) 遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法,告诉他们:“当前SpringBoot应用使用的Environment准备好了咯!”。

5) 如果SpringApplication的showBanner属性被设置为true,则打印banner。

6) 根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,然后根据条件决定是否添加ShutdownHook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader,当然,最重要的,将之前准备好的Environment设置给创建好的ApplicationContext使用。

7) ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中所有可用的ApplicationContext-Initializer,然后遍历调用这些ApplicationContextInitializer的initialize(applicationContext)方法来对已经创建好的ApplicationContext进行进一步的处理。

8) 遍历调用所有SpringApplicationRunListener的contextPrepared()方法。

9) 最核心的一步,将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。

10) 遍历调用所有SpringApplicationRunListener的contextLoaded()方法。

11) 调用ApplicationContext的refresh()方法,完成IoC容器可用的最后一道工序。

12) 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。

13) 正常情况下,遍历执行SpringApplicationRunListener的finished()方法、(如果整个过程出现异常,则依然调用所有SpringApplicationRunListener的finished()方法,只不过这种情况下会将异常信息一并传入处理)

SpringBoot系列-4Web应用

项目结构推荐

root package结构:com.example.demo应用启动类

Application.java置于root package下,这样使用

@ComponentScan注解的时候默认就扫描当前所在类的package

实体(Entity)置于com.example.demo.domain包下

逻辑层(Service)置于com.example.demo.service包下

controller层(web)置于com.example.demo.controller层包下

static可以用来存放静态资源

templates用来存放默认的模板配置路径

Spring MVC自动配置

Spring Boot为Spring MVC提供适用于多数应用的自动配置功能。在Spring默认基础上,自动配置添加了以下特性:

   1、引入ContentNegotiatingViewResolver和BeanNameViewResolver beans。
   2、对静态资源的支持,包括对WebJars的支持。
   3、自动注册Converter,GenericConverter,Formatter beans。
   4、对HttpMessageConverters的支持。
   5、自动注册MessageCodeResolver。
   6、对静态index.html的支持。
   7、对自定义Favicon的支持。

如果想全面控制Spring MVC,你可以添加自己的@Configuration,并使用@EnableWebMvc对其注解。如果想保留Spring Boot MVC的特性,并只是添加其他的MVC配置(拦截器,formatters,视图控制器等),你可以添加自己的WebMvcConfigurerAdapter类型的@Bean(不使用@EnableWebMvc注解)

静态文件

默认情况下,Spring Boot从classpath下一个叫/static(/public,/resources或/META-INF/resources)的文件夹或从ServletContext根目录提供静态内容。这使用了Spring MVC的ResourceHttpRequestHandler,所以你可以通过添加自己的WebMvcConfigurerAdapter并覆写addResourceHandlers方法来改变这个行为(加载静态文件)。

在一个单独的web应用中,容器默认的servlet是开启的,如果Spring决定不处理某些请求,默认的servlet作为一个回退(降级)将从ServletContext根目录加载内容。大多数时候,这不会发生(除非你修改默认的MVC配置),因为Spring总能够通过DispatcherServlet处理请求。

此外,上述标准的静态资源位置有个例外情况是Webjars内容。任何在/webjars/**路径下的资源都将从jar文件中提供,只要它们以Webjars的格式打包。

注:如果你的应用将被打包成jar,那就不要使用src/main/webapp文件夹。尽管该文件夹是一个共同的标准,但它仅在打包成war的情况下起作用,并且如果产生一个jar,多数构建工具都会忽略它

默认资源映射

Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性。 建议大家使用Spring Boot的默认配置方式,提供的静态资源映射如下:

classpath:/META-INF/resources
classpath:/resources
classpath:/static
classpath:/public
优先级顺序为:META-INF/resources > resources > static > public
可以在application.properties中修改:
# 默认值为 /**
spring.mvc.static-path-pattern
# 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
spring.resources.static-locations=这里设置要指向的路径,多个使用英文逗号隔开

模板引擎

Spring Boot支持多种模版引擎包括:

1、FreeMarker

2、Groovy

3、Thymeleaf(官方推荐)

4、Mustache

JSP技术Spring Boot官方是不推荐的,原因有三:

  1、tomcat只支持war的打包方式,不支持可执行的jar。
  2、Jetty 嵌套的容器不支持jsp
  3、Undertow 创建自定义error.jsp页面不会覆盖错误处理的默认视图,而应该使用自定义错误页面

当你使用上述模板引擎中的任何一个,它们默认的模板配置路径为:src/main/resources/templates。当然也可以修改这个路径,具体如何修改,可在各模板引擎的配置属性中查询并修改。

SpringBoot系列-5数据库

Mybatis整合

SpringBoot集成 https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start

Mybatis分页插件: https://github.com/pagehelper/Mybatis-PageHelper

  1. 求tale皮肤 你这个特效蛮炫酷的

    回复
    1. @神秘

      可以 发你邮箱.顺便加个友链

      回复