一、SpringBoot的诞生
虽然Spring的组件代码是轻量级的,但它的配置却是重量级的(需要大量XML配置)。为此, Spring2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。 Spring3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。
尽管如此,我们依旧没能逃脱配置的魔爪。开启某些Spring特性时,比如事务管理和 Spring MVC,还是需要用XML或Java进行显式配置;启用第三方库时也需要显式配置,配置Servlet和过滤器(比如Spring的 DispatcherServlet )同样需要在web.xml或Servlet初始化代码里进行显式配置;组件扫描减少了配置量,Java配置让它看上去简洁不少,但 Spring 还是需要不少配置,为了解决这种情况, SpringBoot 应运而生。Spring 旨在简化 J2EE 企业应用开发,SpringBoot 旨在简化Spring开发(减少配置文件)。
二、SpringBoot的优点
- 开发基于Spring的应用程序很容易。
- SpringBoot项目所需的开发或工程时间明显减少,通常会提高整体生产力。
- SpringBoot可以自动配置,不需要编写大量样板代码、XML配置和注释。
- Spring引导应用程序可以很容易地与Spring生态系统集成,如 Spring JDBC、Spring ORM、Spring Data、SpringSecurity等。
- SpringBoot遵循默认配置,以减少开发工作(默认配置可以修改)。
- SpringBoot应用程序提供嵌入式HTTP服务器,如Tomcat、Jetty和Undertow,可以轻松地开发和测试 web应用程序。
- Spring Boot提供命令行接口(CLI)工具,用于开发和测试SpringBoot应用程序,如Java或 Groovy。
- Spring Boot提供了多种插件,可以使用内置工具(如 Maven和Gradle)开发和测试Spring Boot 应用程序。
三、SpringBoot Starters
Spring Boot Starter是一组预定义的依赖库,它们提供了一种简便高效的方法来在应用程序中包含常见的特性和功能。这些Starter可以帮助开发者聚焦于业务逻辑,而不用担心底层架构。
Spring Boot Starter包括许多常用的模块,例如:
- spring-boot-starter-web:该Starter提供所需的依赖库以使用Spring Boot开发Web应用程序。
- spring-boot-starter-data-jpa:该Starter提供所需的依赖库以使用Java Persistence API (JPA)处理数据源。
- spring-boot-starter-security:该Starter提供所需的依赖库以实现Spring Boot应用程序中的安全。
- spring-boot-starter-jdbc:该Starter提供所需的依赖库以使用JDBC数据库。
- spring-boot-starter-test:该Starter提供所需的依赖库以编写Spring Boot应用程序的测试。
这些Starter简化了开发过程,帮助开发者快速高效地创建生产就绪的应用程序。
四、@SpringBootApplication注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}
可以看出来,大概可以把 @SpringBootApplication 看作是 @Configuration 、 @ EnableAutoConfigeration 、 @ComponentScan 注解的集合。
这三个注解的作用分别是:
- @EnableAutoConfigeration :启用SpringBoot的自动配置机制;
- @ComponentScan :扫描被 @Component (@Service,@Controller..)注解的bean,注解默认会扫描该类所在包下的所有的类;
- @Configuration :允许在上下文中注册额外的bean或倒入其他配置类。
五、SpringBoot的自动配置
1 .SpringBoot自动配置主要是由 @EnableAutoConfigeration 这个注解实现的。
2. @EnableAutoConfigeration 注解通过Spring提供的 @Import 注解导入了 AutoConfigurationImportSelector 类。
3. AutoConfigurationImportSelector 类中getCandidateConfigurations 方法会将所有自动配置类的信息以List的形式返回,这些配置信息会被Spring容器作Bean来管理。
六、RESTfulWeb服务常用的注解
SpringBean相关:
- @Autowired :自动装配对象到类中,被注入进的类同样要被Spring容器管理;
- @RestController : @RestController 注解是 @Controller 和 @ResponseBody 的合集,表 示这是个控制器bean,并且是将函数的返回值直接填入HTTP 响应体中,是REST风格的控制器;
- @Component :通用的注解,可标注任意类为Spring组件,如果一个Bean不知道属于哪个层,可以使用 @Component 注解标注;
- @Repository :对应持久层即Dao层,主要用于数据库相关操 作;
- @Service :对应服务层,主要涉及一些复杂的逻辑,需要用到Dao层。
- @Controller :对应SpringMVC控制层,主要用于接受用户请求并调用Service层返回数据给前端页面。
处理常见的HTTP请求类型:
- @GetMapping :GET请求;
- @PostMapping :POST请求;
- @PutMapping :PUT请求;
- @DeleteMapping :DELETE请求;
前后端传值:
- @PathVairable: @PathVariable 用于获取路径参数;
- @ RequestParam:@RequestParam 用于获取查询参数;
- @RequestBody : 用于读取 Request 请 求 ( 可能是 POST , PUT,DELETE,GET请求)的body部分并且Content-Type为 a pplication/json 格式的数据,接收到数据之后会自动将数据 绑定到 Java对象上去;系统会使用 HttpMessageConverter 或者自定义的HttpMessageConverter 将请求的body中的json 字符串转换为java对象。
七、配置文件
SpringBoot可以通过 application.properties 或 application.yml 对SpringBoot程序进行简单的配置,如果你不进行配置的话,就是使用的默认配置。一般我们使用.yml的方式来进行配置。
YAML是一种人类可读的数据序列化语言,它通常用于配置文件,与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆;相比于Properties配置的方式,YAML配置的方式更加直观清晰,简介明了,有层次感。
YAML配置的方式缺点:不支持 @PropertySource 注解导入自定义的YAML配置。
八、常用的读取配置文件的方法
- 通过 @Value 读取比较简单的配置信息(不推荐);
- 通过 @ConfigurationProperties 读取并与bean绑定;
- 通过 @ConfigurationPraperties 读取并校验;
- 通过 @PropertySource 读取指定的properties文件;
九、请求参数校验
数据的校验的重要性不言而喻,即使在前端对数据进行校验的情况下,我们还是要对传入后端的 数据再进行一遍校验,避免用户绕过浏览器直接通过一些HTTP工具直接向后端请求一些违法数据。SpringBoot程序做请求参数校验的话只需要spring-boot-starter-web依赖就够了,它的子依赖包含了我们所需要的东西。
JSR提供的校验注解:
- @Null 被注释的元素必须为null
- @NotNull 被注释的元素必须不为null
- @AssertTrue 被注释的元素必须为true
- @AssertFalse 被注释的元素必须为false
- @Min(value) 被注释的元素必须是一个数字,其值必须大干等干指定的最小值
- @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小干等干指定的最大值
- @Size(max=,min=) 被注释的元素的大小必须在指定的范围内
- @Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
- @Past 被注释的元素必须是一个过去的日期
- @Future被注释的元素必须是一个将来的日期@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
Hibernate Validator提供的校验注解:
- @NotBlank(message=) 验证字符串非null,且长度必须大于0
- @Email 被注释的元素必须是电子邮箱地址
- @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
- @NotEmpty 被注释的字符串的必须非空
- @Range(min=,max=,message=) 被注释的元素必须在合适的范围内
我们在需要验证的参数上加上了 @Valid 注解,如果校验失败,他将抛出 MethodArgumentNotValidException ;默认情况下,Spring会将此一场转换为HTTP Status 400 (错误请求)。一定不要忘记在类上加上Validated注解,这个参数可以告诉Spring去校验方法参数。