Spring 家族面试题 021 - 030
021、什么是 Spring 框架?有什么缺点?
Spring 为企业级 Java 应用的开发提供了一种相对简单的方法,通过依赖注入和面向切面编程大大提高了开发效率,并且提高了系统的可维护性和可扩展性。
Spring 的组件代码是轻量级的,但它的配置却是重量级的,为了简化配置,后来有创建了 Spring Boot。
022、开发 RESTful 服务常用的注解有哪些?
Spring Bean 相关
-
@Autowired
: 自动导入对象到类中,被注入进的类同样要被 Spring 容器管理。 -
@RestController
:@RestController
注解是@Controller和
@ResponseBody
的合集,表示这是个控制器 bean,并且是将函数的返回值直 接填入 HTTP 响应体中,是 REST 风格的控制器。 -
@Component
:通用的注解,可标注任意类为Spring
组件。如果一个 Bean 不知道属于哪个层,可以使用@Component
注解标注。 -
@Repository
: 对应持久层即 Dao 层,主要用于数据库相关操作。 -
@Service
: 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。 -
@Controller
: 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。
处理常见的 HTTP 请求类型
-
@GetMapping
: GET 请求。 -
@PostMapping
: POST 请求。 -
@PutMapping
: PUT 请求。 -
@DeleteMapping
: DELETE 请求。
前后端传值
-
@RequestParam
以及@Pathvairable
:@PathVariable
用于获取路径参数,@RequestParam
用于获取查询参数。 -
@RequestBody
:用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且 Content-Type 为application/json
格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用HttpMessageConverter
或者自定义的HttpMessageConverter
将请求的 body 中的 json 字符串转换为 java 对象。
023、Spring Boot 常见的两种配置文件?
application.properties
和 application.yml
。
YAML 是一种人类可读的数据序列化语言,相比于 Properties 配置的方式,YAML 文件就更加结构化,YAML 配置的方式更加直观清晰,简介明了,有层次感。
但是,YAML 配置的方式有一个缺点,那就是不支持 @PropertySource
注解导入自定义的 YAML 配置。
024、Spring Boot 如何监控系统实际运行状况?
我们可以使用 Spring Boot Actuator 来对 Spring Boot 项目进行简单的监控。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
集成了这个模块之后,你的 Spring Boot 应用程序就自带了一些开箱即用的获取程序运行时的内部状态信息的 API。
比如通过 GET 方法访问 /health
接口,你就可以获取应用程序的健康指标。
025、Spring Boot 如何做请求参数校验?
Spring Boot 程序做请求参数校验的话只需要 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=)
被注释的元素必须在合适的范围内
更多内容请参考: 如何在 Spring/Spring Boot 中做参数校验?你需要了解的都在这里!
026、如何使用 Spring Boot 实现全局异常处理?
可以使用 @ControllerAdvice
和 @ExceptionHandler
处理全局异常。
更多内容请参考:Spring Boot 异常处理在实际项目中的应用
027、Spring Boot 如何启动一个定时任务?
使用 @Scheduled
注解就能很方便地创建一个定时任务。
@Component
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
/**
* fixedRate:固定速率执行。每5秒执行一次。
*/
@Scheduled(fixedRate = 5000)
public void reportCurrentTimeWithFixedRate() {
log.info("Current Thread : {}", Thread.currentThread().getName());
log.info("Fixed Rate Task : The time is now {}", dateFormat.format(new Date()));
}
}
但单纯依靠 @Scheduled
注解还不行,我们还需要在启动类上加上 @EnableScheduling
注解,这样才可以启动定时任务。
@EnableScheduling
注解的作用是发现注解 @Scheduled
的任务并在后台执行该任务。
028、未完待续
029、
030、
上一篇: Java实现深度优先遍历和广度优先遍历
下一篇: 深度优先搜索和广度优先搜索