4.1你使用过哪些springBoot的注解?
(1)@SpringBootApplication
这个注解是SpringBoot项目的基石,创建SpringBoot项目之后会默认加在主类上。可以看这个注解看做是@Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合。
- @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制。
- @ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。
- @Configuration:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
(2)Spring Bean相关
@Autowired:依赖注入,将被依赖对象注入到依赖对象的属性中,被注入的类同样需要被ioc容器管理,比如把UserService注入到UserController中。
- @Component :通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。
- @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
- @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
- @Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。
- @RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器 bean,并且是将函数的返回值直接填入 HTTP 响应体中,是 REST 风格的控制器。
- @Scope声明 Spring Bean 的作用域,默认是单例。
- @Configuration,一般用来声明配置类,可以使用 @Component注解替代,不过使用@Configuration注解声明配置类更加语义化。
(3)Http请求类型
GET :请求从服务器获取特定资源。举个例子:GET /users(获取所有学生)
POST :在服务器上创建一个新的资源。举个例子:POST /users(创建学生)
@GetMapping(“users”) 等价于@RequestMapping(value=”/users”,method=RequestMethod.GET)
@PostMapping(“users”) 等价于@RequestMapping(value=”/users”,method=RequestMethod.POST)
(4)前后端传值
@PathVariable 和 @RequestParam
@PathVariable用于获取路径参数,@RequestParam用于获取查询参数
@GetMapping("/klasses/{klassId}/teachers")
public List<Teacher> getKlassRelatedTeachers(
@PathVariable("klassId") Long klassId,
@RequestParam(value = "type", required = false) String type ) {
}
如果我们请求的 url 是:/klasses/123456/teachers?type=web
那么我们服务获取到的数据就是:klassId=123456,type=web。
@RequestBody
用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用HttpMessageConverter或者自定义的HttpMessageConverter将请求的 body 中的 json 字符串转换为 java 对象。
(5)读取配置信息
很多时候我们需要将一些常用的配置信息比如阿里云 oss、发送短信、微信认证的相关配置信息等等放到配置文件中。
@Value(“${property}”) 读取比较简单的配置信息;
@Value("${wuhan2020}")
String wuhan2020;
通过@ConfigurationProperties读取配置信息并与 bean 绑定。
(6)参数验证
- @NotEmpty 被注释的字符串的不能为 null 也不能为空
- @NotBlank 被注释的字符串非 null,并且必须包含一个非空白字符
- @Null 被注释的元素必须为 null
- @NotNull 被注释的元素必须不为 null
- @AssertTrue 被注释的元素必须为 true
- @AssertFalse 被注释的元素必须为 false
- @Pattern(regex=,flag=)被注释的元素必须符合指定的正则表达式
- @Email 被注释的元素必须是 Email 格式。
- @Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @Size(max=, min=)被注释的元素的大小必须在指定的范围内
- @Digits(integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
- @Past被注释的元素必须是一个过去的日期
- @Future 被注释的元素必须是一个将来的日期
(7)全局处理Controller层异常
@ControllerAdvice :注解定义全局异常处理类
@ExceptionHandler :注解声明异常处理方法
(8)声明式事务
在要开启事务的方法上使用@Transactional注解即可
(9)@JsonFormat一般用来格式化 json 数据。
4.2说说SpringBoot的自动配置
自动配置:通过注解或者一些简单的配置就能在SpringBoot的帮助下实现某块功能。
广义的配置类:被注解@Component直接或间接修饰的某个类,就是我们常说的Spring组件,其中包括了@Configuration类;
狭义的配置类:特指被注解@Configuration所修饰的某个类;
比如Redis的自动配置:
(1)引入maven依赖;
(2)配置Redis服务器的yml配置文件;,包括database、host、port、password等基本信息;
(3)最后就可以直接在需要使用的类上注入依赖的对象redisTemplate;
整个自动装配的过程是:SpringBoot通过@EnableAutoConfiguration注解开启自动配置,加载spring.factories中注册的各种AutoConfiguration类,当某个AutoConfiguration类满足其注解@Conditional指定的生效条件时,实例化该AutoConfiguration类中定义的Bean,并注入到Spring容器,就可以完成依赖框架的自动配置。
4.3说说你对Spring Boot的理解
从本质上来说,SpringBoot就是Spring,它做了那些没有它自己需要去做的Spring Bean的配置。SpringBoot使用”习惯优于配置”的理念让项目快速地运行起来,使用SpringBoot很容易创建一个能独立运行、准生产级别、基于Spring框架的项目,使用SpringBoot可以不用或者只需要很少的Spring配置。Spring是作为Spring的脚手架框架,达到快速构建项目、预置三方配置、开箱即用的目的。有以下优点:
(1)快速构建项目
(2)对主流开发框架的无配置集成
(3)项目可独立运行,内置Tomcat服务器,不需要外部依赖Servlet容器
(4)极大提高开发、部署效率
4.4Spring Boot Starter有什么用?
SpringBoot通过提供众多起步依赖starter降低项目依赖的复杂度,起步依赖本质上一个Maven项目对象模型,定义了对其他库的传递依赖,这些东西加在一起就可以支持某项功能。它的目的也是简化配置,解决依赖管理配置复杂的问题,有了它,当我们需要构建一个Web应用程序时,不必再遍历所有的依赖包,一个一个地添加到项目的依赖管理中,而是只需要配置一个:spring-boot-starter-web就可以了。
4.5说说SpringBoot的启动流程
首先,SpringBoot项目创建完成会默认生成一个名为”Application”的入口类,我们是通过该类的main方法启动SpringBoot项目的。在main方法中,通过SpringApplication的静态方法就是run方法进行SpringApplication类的实例化操作,然后再针对实例化对象调用另一个run方法来完成整个项目的初始化和启动。
SpringBoot的启动流程:
(1)创建一个ApplicationContext实例,即我们常说的ioc容器;
(2)加载源配置类,通常是main方法所在的类,而且会被注解@SpringBootApplication所修饰,将主类注册到ioc容器中;
(3)递归加载并处理所有的配置类;
3.1处理@ComponentScan,根据@ComponentScan扫描指定的package,得到一系列配置类;
3.2处理注解@Import,根据注解@Import,得到一系列被导入的配置类;
3.3处理带有@Bean注解的方法;
3.4处理@Import导入的ImportBeanDefinitionRegister;
3.5加入到一个全局的配置类集合中。
(4)实例化所有的单例Bean,”依赖注入”和”自动装配”就属于其中的环节;
(5)如果是web应用,则启动web服务器(如Tomcat)
@Import注解的作用是提供了一种显式地从其他地方加载配置类的方式,这样可以避免性能较差的组件扫描(Component Scan)。