当前位置: 首页 > news >正文

面试题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应用,而无需手动添加和配置各个依赖项。

<dependencies><!-- 用于Web开发的起始依赖包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

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应用的上下文。
自动配置的工作原理:

  1. 加载spring.factories文件
    @EnableAutoConfiguration注解通过Spring提供的@Import注解导入了AutoConfigurationImportSelector类,该类中的方法会读取spring.factories文件中的配置,加载所有的自动配置类。
  2. 通过条件注解判断该配置类是否应该被加载:每个自动配置类通常都带有一组条件注解,用于判断该配置类是否应该被加载。条件注解有@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty。
  3. 创建和注册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 setterspublic 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 {@Autowiredprivate 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

相关文章:

  • git列出提交记录的文件路径
  • 论文翻译 | LEAST-TO-MOST: 从最少到最多的提示使大型语言模型中的复杂推理成为可能
  • 2024-07-14 Unity插件 Odin Inspector1 —— 插件介绍
  • LeetCode 每日一题 2024/7/8-2024/7/14
  • Spring-Spring、IoC、DI、注解开发
  • Qt学生管理系统-- 数据库课程设计(付源码)
  • Anything in Any Scene:无缝融入任何场景,实现逼真视频对象插入技术
  • linux彻底卸载docker
  • Qt 实战(2)搭建开发环境 | 2.3、qmake详解
  • Java中线程启动:start()与run()方法的区别
  • 2024-07-12 Unity AI状态机1 —— 框架介绍
  • 案例|LabVIEW连接S7-1200PLC
  • pytorch说明
  • Java 实验三:数组操作以及Java中的方法
  • 解决方案架构师系列 - AWS - AWS Amplify 服务功能介绍
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [译] 怎样写一个基础的编译器
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 2017 年终总结 —— 在路上
  • 78. Subsets
  • co.js - 让异步代码同步化
  • ERLANG 网工修炼笔记 ---- UDP
  • Linux CTF 逆向入门
  • PhantomJS 安装
  • React Transition Group -- Transition 组件
  • SegmentFault 2015 Top Rank
  • Unix命令
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 技术发展面试
  • 简单数学运算程序(不定期更新)
  • 数组的操作
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • FaaS 的简单实践
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (52)只出现一次的数字III
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (篇九)MySQL常用内置函数
  • (四)stm32之通信协议
  • (转)关于多人操作数据的处理策略
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .chm格式文件如何阅读
  • .NET 8.0 发布到 IIS
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net Core和.Net Standard直观理解
  • .Net 知识杂记
  • ::前边啥也没有