关于Java经典面试题汇总:Spring Boot的完整攻略,我一方面可以介绍一些常见的Spring Boot面试题,另一方面也可以分享一些解决这些问题的方法和技巧。
Spring Boot常见面试题目
以下是一些常见的Spring Boot面试题目,你可以参考或练习它们:
1. Spring Boot的自动配置原理是什么?
2. Spring Boot如何启动一个Web应用?
3. Spring Boot如何处理跨域请求?
4. Spring Boot与Spring MVC的区别是什么?
5. Spring Boot如何配置数据源?
6. Spring Boot如何配置多个数据源?
7. Spring Boot如何实现实时刷新配置?
8. Spring Boot如何实现定时任务?
9. Spring Boot如何集成Mybatis?
10. Spring Boot如何集成Redis?
11. Spring Boot如何实现缓存?
12. Spring Boot如何处理异常?
13. Spring Boot如何实现文件上传?
14. Spring Boot如何实现Json数据的序列化和反序列化?
15. Spring Boot如何集成Swagger?
解决方法和技巧
面对这些问题,我可以给出一些解决方法和技巧。下面将简要介绍其中一些:
1. Spring Boot的自动配置原理是什么?
Spring Boot的自动配置原理涉及到条件注解、SPI机制和Spring Boot Starter。Spring Boot Starter 是个种依赖包,当引入某个 Starter 时,该 Starter 包下的一些依赖也会被自动引入到项目中,从而免去了开发人员自己添加配置文件等繁琐操作。同时,Spring Boot 根据应用的依赖和配置情况,利用条件注解和 SPI 机制,自动进行相应的配置。
2. Spring Boot如何启动一个Web应用?
主要有两种方式:
- 使用 Spring Boot Maven 插件,在终端运行
mvn spring-boot:run
命令即可启动项目 - 在 IDEA 的 Run 配置中,添加 Spring Boot 应用,选择 main 方法所在类即可启动项目。
示例一:
创建一个SpringBoot项目,并在其Controller中编写以下代码:
@RestController
public class HelloController{
@GetMapping("/hello")
public String hello(){
return "Hello, world!";
}
}
代码的作用是向客户端返回一个字符串“Hello, world!”。
在应用启动后,可以在浏览器访问 http://localhost:8080/hello
以获取到 “Hello, world!”的返回结果。
示例二:
在application.properties文件中添加如下配置:
server.port=9090
这会将应用的端口更改为9090,以便在启动时使用9090端口。
3. Spring Boot如何处理跨域请求?
解决跨域请求的问题,主要是利用了 CORS(Cross-Origin Resource Sharing)协议。在 Spring Boot 中,可以通过在 WebMvcConfigurer 接口中实现 addCorsMappings 方法,来定制自己的跨域配置。具体的代码可以参考:
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.maxAge(3600)
.allowCredentials(true);
}
}
示例代码中,allowedOrigins 指允许跨域请求的域名,allowedMethods 指允许的请求方式,allowedHeaders 指允许发送的请求头,maxAge 指 preflight 请求(OPTIONS)的有效时间,allowCredentials 指是否允许发送 Cookie 等凭证信息。
4. Spring Boot与Spring MVC的区别是什么?
虽然 Spring Boot 和 Spring MVC 皆属于Spring框架,但它们的作用和应用场景却不完全相同。Spring MVC 通常用于搭建传统的 Web 应用程序,而 Spring Boot 则主要用于快速构建偏向于微服务架构的应用,例如RPC、消息队列、定时任务、缓存等。同时,Spring Boot 自带了 Tomcat、Jetty、Undertow服务器等嵌入式 Web 服务器,而Spring MVC需要手动添加。
示例一:
创建一个HelloController,并通过以下代码返回一个jsp页面:
@Controller
public class HelloController {
@GetMapping("/")
public String index() {
return "index";
}
}
在视图层resources/templates下创建index.jsp,编写以下代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Hello Spring Boot!</h1>
</body>
</html>
在应用启动后,可以在浏览器访问 http://localhost:8080
以获取到 Hello Spring Boot!页面。
示例二:
创建一个自定义注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginRequired {
}
在Controller中定义一个被该注解所修饰的RequestMapping:
@RestController
@RequestMapping("/user")
public class UserController {
@LoginRequired
@RequestMapping("/profile")
public String profile() {
return "Welcome to your profile page!";
}
}
通过在 Spring Boot Application 启动类上添加@EnableWebMvc注解,使得应用程序运行时,可以启用Spring MVC的WebMvcConfigurerAdapter类以及MVC框架的所有默认配置。这样就可以实现注解拦截。
@SpringBootApplication
@EnableWebMvc
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
5. Spring Boot如何配置数据源?
通过在 application.yml 配置文件中添加如下配置:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai
username: root
password: root
Spring Boot默认支持的数据源有如下几种:
- com.zaxxer.hikari.HikariDataSource
- org.apache.tomcat.jdbc.pool.DataSource
- org.apache.commons.dbcp2.BasicDataSource
示例:
创建一个应用程序,使用Spring JPA将数据保存到数据库中。
定义一个实体类:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Integer age;
// getter / setter
}
通过继承JpaRepository接口,即可使用JBPA提供的CRUD方法
public interface UserRepository extends JpaRepository<User, Long> {
User findById(long id);
void deleteById(Long id);
}
在Service层中进行具体操作:
@Service
public UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Transactional
@Override
public User saveUser(User user) {
return userRepository.save(user);
}
}
6. Spring Boot如何配置多个数据源?
使用Dynamic Datasource路由,可以根据Key的不同自动路由到不同的数据源。
在pom.xml文件中添加如下依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${dynamic-datasource-spring-boot-starter.version}</version>
</dependency>
在application.yml配置文件中添加如下配置:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/master_db
username: test
password: test
dynamic:
datasource:
datasource1:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/data_source_1
username: test
password: test
datasource2:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/data_source_2
username: test
password: test
primary: datasource1
在DataSource的配置类中添加注解@EnableDynamicDataSource:
@Configuration
@EnableDynamicDataSource
public class DynamicDataSourceConfiguration {
@Bean
@ConfigurationProperties("spring.datasource")
public DataSource masterDataSource() {
return new DruidDataSource();
}
@Bean
@ConfigurationProperties("spring.dynamic.datasource.datasource1")
public DataSource dataSource1() {
return new DruidDataSource();
}
@Bean
@ConfigurationProperties("spring.dynamic.datasource.datasource2")
public DataSource dataSource2() {
return new DruidDataSource();
}
@Bean
@Primary
public DataSource dataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setDefaultTargetDataSource(masterDataSource());
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("datasource1", dataSource1());
targetDataSources.put("datasource2", dataSource2());
dynamicDataSource.setTargetDataSources(targetDataSources);
return dynamicDataSource;
}
}
至此就实现了多数据源配置。
7. Spring Boot如何实现实时刷新配置?
在Spring Boot 2.x中,可以使用Spring Cloud Config推送、普通Spring Boot属性自动刷新、Spring Cloud Bus等方式来实现属性实时刷新的功能。
其中,使用Spring Cloud Bus进行动态刷新配置,需要依赖RabbitMQ或Kafka服务。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
同时,在需要刷新的类中添加注解@RefreshScope。例如:
@RestController
@RefreshScope
public class HelloController {
@Value("${greet}")
private String greet;
@GetMapping("/hello")
public String hello() {
return greet;
}
}
在代码中,通过@Value注解自动装配属性,并在GetMapping注解下添加上@RefreshScope注解,即可实现属性自动刷新。
8. Spring Boot如何实现定时任务?
利用Spring Boot内嵌集成的 Quartz框架和自带的 Scheduled Task机制,可以简单地实现定时任务。
以下是Spring Boot Schedule使用例子:
@Component
public class ScheduledTasks {
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
System.out.println("现在时间:" + new Date());
}
}
以上代码,表示每五秒打印当前时间。
9. Spring Boot如何集成Mybatis?
使用Spring Boot的Mybatis Starter即可。它会自动地配置数据源、SqlSessionFactory、MapperScannerConfigurer三个bean,而且还会根据配置文件自动扫描所在的包路径。
添加以下依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>{mybatis-starter.version}</version>
</dependency>
在application.yml配置文件中添加如下配置:
mybatis:
type-aliases-package: com.example.demo.pojo #指定实体类的路径
mapper-locations: classpath:mapper/*.xml #指定mybatis的xml文件路径
10. Spring Boot如何集成Redis?
使用Redis Starter即可,Spring Boot会自动集成Jedis或Lettuce作为Redis客户端。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${spring-boot.version}</version>
</dependency>
在application.yml配置文件中添加如下配置:
spring:
redis:
host: localhost
port: 6379
timeout: 10000
password: test
11. Spring Boot如何实现缓存?
Spring Boot提供了多种缓存方式,如使用Ehcache、Redis等。缓存主要是通过 @EnableCaching 注解开启缓存支持,然后在方法上添加缓存注解比如@Cacheable等。
具体可以参考:
@EnableCaching
@Configuration
public class CacheConfiguration {
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(1));
return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration).build();
}
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Cacheable(value = "userCache", key = "#username")
public User findByUserName(String username) {
return userRepository.findByUserName(username);
}
@CachePut(value = "userCache", key = "targetClass + methodName + #user.username")
public User save(User user) {
return userRepository.save(user);
}
@CacheEvict(value = "userCache", key = "#id")
public void deleteById(Long id) {
userRepository.deleteById(id);
}
}
在使用缓存操作时,在被调用的方法上添加 @Cacheable、@CachePut、@CacheEvict 等注解即可。
12. Spring Boot如何处理异常?
对于自定义异常,可以继承RuntimeException或者Exception;
- RuntimeException:属于unchecked exception,可不用显式地在方法签名中说明抛出异常;
- Exception:属于checked exception,必须在方法签名中说明该方法有可能抛出的异常。
在 configuration 包中新建一个 GlobalExceptionHandler 类,用于处理全局异常:
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
private static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = Exception.class)
public Result errorHandler(Exception exception) {
logger.error(exception.getMessage(), exception);
if (exception instanceof BindException) {
BindException bindException = (BindException) exception;
FieldError fieldError = bindException.getFieldError();
return Result.failure(fieldError.getDefaultMessage());
} else if (exception instanceof MethodArgumentNotValidException) {
MethodArgumentNotValidException methodArgumentNotValidException =
(MethodArgumentNotValidException) exception;
BindingResult bindingResult = methodArgumentNotValidException.getBindingResult();
FieldError fieldError = bindingResult.getFieldError();
return Result.failure(fieldError.getDefaultMessage());
} else {
return Result.failure(CommonConstant.ERROR_CODE, exception.getMessage());
}
}
}
在上述代码中,@ControllerAdvice注解表示全局的Controller异常处理器,@ExceptionHandler注解表示具体的异常处理器,这里列举了几种常见异常的处理方式。
13. Spring Boot如何实现文件上传?
在pom.xml文件中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
编写Controller控制器:
@RestController
@RequestMapping(value = "/")
public class FileUploadController {
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return "文件为空";
}
// 获取文件全名
String originalFilename = file.getOriginalFilename();
// 获取后缀名
String suffixName = originalFilename.substring(originalFilename.lastIndexOf("."));
// 自定义文件名称
String fileName = UUID.randomUUID() + suffixName;
// 文件路径+自定义文件名称
String filePath = "D:/upload/" + fileName;
try {
// 存储到磁盘中
file.transferTo(new File(filePath));
} catch (Exception e) {
e.printStackTrace();
return "上传失败";
}
return "上传成功";
}
}
在浏览器中输入如下地址:http://localhost:8080/upload.html,编写一个Html文件。如下:
```
<form method
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java经典面试题汇总:Spring Boot - Python技术站