面试题008-Java-SpringBoot

07-10 1053阅读

面试题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配置文件或基于注解的配置,所以在配置上它比较繁琐。

          面试题008-Java-SpringBoot
          (图片来源网络,侵删)

          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应用的上下文。

              自动配置的工作原理:

              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 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
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]