面试题008-Java-SpringBoot
面试题008-Java-SpringBoot
目录
- 面试题008-Java-SpringBoot
- 题目自测
- 题目答案
- 1. Spring 和 Spring Boot有什么区别?
- 2. Spring Boot 的主要优点是什么?
- 3. 什么是Spring Boot Starter?
- 4. 介绍一下@SpringBootApplication注解?
- 5. Spring Boot是如何实现自动配置的?
- 6. Spring Boot中读取配置文件的方式有哪些?
- 7. Spring Boot中加载配置文件的优先级是怎样的?
- 8. 如何在Spring Boot中实现日志记录?
- 参考资料
题目自测
- 1. Spring 和 Spring Boot有什么区别?
- 2. Spring Boot 的主要优点是什么?
- 3. 什么是Spring Boot Starter?
- 4. 介绍一下@SpringBootApplication注解?
- 5. Spring Boot是如何实现自动配置的?
- 6. Spring Boot中读取配置文件的方式有哪些?
- 7. Spring Boot中加载配置文件的优先级是怎样的?
- 8. 如何在Spring Boot中实现日志记录?
题目答案
1. Spring 和 Spring Boot有什么区别?
答:Spring是一个Java应用开发框架,它提供了丰富的功能,如依赖注入、面向切面编程等功能,简化了企业级应用开发。但它需要大量的XML配置文件或基于注解的配置,所以在配置上它比较繁琐。
(图片来源网络,侵删)Spring Boot是基于Sring框架的子项目,主要是为了简化Spring应用的创建和配置。通过约定优于配置的原则,减少了开发和配置的复杂性。
2. Spring Boot 的主要优点是什么?
答:Spring Boot的主要优点有:
- 简化配置:遵循约定优于配置的原则,默认提供了很多合理的配置,开发者只需在必要时进行定制化配置。
- 内嵌服务器:Spring Boot支持内嵌的Tomcat,Jetty等服务器,使得打包可以生成一个可以直接运行的JAR文件。
- 快速开发:Spring Boot提供了快速开发的体验,包括热部署、自动刷新等功能,提供了Spring Initializer工具。
- 生产就绪功能:提供了强大的生产环境的监控和管理功能。
- 简化依赖管理:Spring Boot使用了起步依赖来简化构建配置,避免了手动管理依赖及其版本号的麻烦。
3. 什么是Spring Boot Starter?
答:Spring Boot Starter 是 Spring Boot 提供的一系列依赖包,用于简化应用程序的依赖管理和配置。它预先打包了一组相关的库和配置,帮助开发者快速搭建不同功能的Spring Boot应用,而无需手动添加和配置各个依赖项。
org.springframework.boot spring-boot-starter-web
4. 介绍一下@SpringBootApplication注解?
答:@SpringBootApplication注解主要是用于简化Spring Boot应用的配置和启动。它是一个组合注解,包含了多个常用的Spring注解。该注解主要包含了以下三个注解:
- @SpringBootConfiguration:标识这是一个配置类。
- @EnableAutoConfiguration:启用 Spring Boot 的自动配置机制,根据类路径中的依赖和配置文件中的配置,自动配置 Spring 应用上下文。
- @ComponentScan:启用组件扫描,自动发现和注册 Spring 组件(如@Compoent、@Service等)。
@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) }) @Import({ AutoConfigurationImportSelector.class }) public @interface SpringBootApplication { // .... }
5. Spring Boot是如何实现自动配置的?
答:Spring Boot中的自动配置是通过@SprinBootApplication注解中的@EnableAutoConfiguration注解来启用自动配置机制的,指示Spring Boot根据应用的依赖和配置自动配置Spring应用的上下文。
自动配置的工作原理:
- 加载spring.factories文件
@EnableAutoConfiguration注解通过Spring提供的@Import注解导入了AutoConfigurationImportSelector类,该类中的方法会读取spring.factories文件中的配置,加载所有的自动配置类。
- 通过条件注解判断该配置类是否应该被加载:每个自动配置类通常都带有一组条件注解,用于判断该配置类是否应该被加载。条件注解有@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty。
- 创建和注册Bean,实现自动配置:满足条件的自动配置类会被加载,并按照其定义创建和注册相应的 Bean。
6. Spring Boot中读取配置文件的方式有哪些?
答:常见的读取配置的方式有:
-
使用@Value注解:直接在字段或方法参数上使用。
@Component public class AppConfig { @Value("${app.name}") private String appName; @Value("${app.version}") private String appVersion; // getters and setters }
-
使用@ConfigurationProperties注解:注解用于将配置文件中的属性映射到一个 Java 类中。
@Component @ConfigurationProperties(prefix = "app") public class AppProperties { private String name; private String version; private Security security; // getters and setters public static class Security { private String username; private String password; // getters and setters } }
-
使用@propertySource注解:注解用于加载非默认位置的配置文件。
@Configuration @PropertySource("classpath:config.properties") public class PropertySourceConfig { @Value("${app.name}") private String appName; @Value("${app.version}") private String appVersion; // getters and setters }
-
使用Environment接口:用于以编程方式访问属性值。
@Component public class EnvironmentConfig { @Autowired private Environment env; public String getAppName() { return env.getProperty("app.name"); } public String getAppVersion() { return env.getProperty("app.version"); } }
7. Spring Boot中加载配置文件的优先级是怎样的?
答:Spring Boot中配置文件加载的优先级从高到低依次是:命令行参数、系统属性、外部配置文件、内部配置文件、@PropertySource 注解声明的属性源和默认属性。
- 命令行参数:在启动应用时通过命令行传递的参数。例如,–server.port=8081。
- 系统属性:通过System.gerProperties()访问的属性。
- 外部配置文件:jar包外部的application.properties或application.yml文件。
- 内部配置文件:jar包内部的application.properties或application.yml文件。
- @PropertySource 注解声明的属性源。
- 默认属性。
8. 如何在Spring Boot中实现日志记录?
答:在Spring Boot中默认使用Logback作为日志框架进行日志记录,默认情况下,Spring Boot会自动对Logback进行配置。如果你需要更复杂的日志配置,可以通过自定义Logback配置文件来实现。
@Component public class MyComponent { private static final Logger logger = LoggerFactory.getLogger(MyComponent.class); public void doSomething() { logger.info("This is an info message"); logger.debug("This is a debug message"); logger.error("This is an error message"); } }
参考资料
- JavaGuide
- 牛客网-Java面试宝典
- Spring源码解析
- Spring官方文档
- ChatGPT
- 加载spring.factories文件