史上最屁精的springBoot面试题

1、SpringBoot Starter 的工作原理是什么?

SpringBoot 在启动的时候会干这几件事情:
1、 SpringBoot 在启动时会去依赖的 Starter 包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。
2、 根据 spring.factories 配置加载 AutoConfigure 类
3、 根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context
总结一下,其实就是 SpringBoot 在启动的时候,按照约定去读取 SpringBoot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 SpringBoot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可。

2、SpringBoot 的核心配置文件有哪几个?它们的区别是什么?

SpringBoot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件这个容易理解,主要用于 SpringBoot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景。
使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
一些固定的不能被覆盖的属性;
一些加密/解密的场景;

3、Spring、SpringBoot、SpringMVC的区别?

1、 Spring框架就像一个家族,有众多衍生产品,例如boot、mvc、jpa等等。但他们的基础都是Spring的ioc、aop。ioc提供了依赖注入的容器,aop解决了面向横切面编程,然后在此两者的基础上实现了其它延伸产品的高级功能;
2、 springMVC是基于Servlet的一个MVC框架主要解决WEB开发的问题;
3、 为了简化开发的使用,从而创造性地推出了SpringBoot框架,默认优于配置

4、SpringBoot的核心注解是哪个?它主要由哪几个注解组成的?

启动类上面的注解是@SpringBootApplication,它也是SpringBoot的核心注解,主要组合包含了以下3个注解:
1、 @SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能。
2、 @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
3、 @ComponentScan:Spring组件扫描

5、SpringBoot 配置文件的加载顺序

优先加载带profile
jar包外部的application-{profile}.properties或application.yml(带spring.profile配置文件
jar包内部的application-{profile}.properties或application.yml(带spring.profile配置文件
再来加载不带profile
jar包外部的application.properties或application.yml(不带spring.profile配置文件
jar包内部的application.properties或application.yml(不带spring.profile配置文件

6、运行 SpringBoot 有哪几种方式?

1、 打包用命令或者者放到容器中运行
2、 用 Maven/ Gradle 插件运行
3、 直接执行 main 方法运行
4、java -jar xxx.jar --spring.active.profile=dev

7、SpringBoot常用的starter有哪些?

1、 spring-boot-starter-web (嵌入tomcat和web开发需要servlet与jsp支持)
2、 spring-boot-starter-data-jpa (数据库支持)
3、 spring-boot-starter-data-Redis (Redis数据库支持)
4、 spring-boot-starter-data-solr (solr搜索应用框架支持)
5、 mybatis-spring-boot-starter (第三方的mybatis集成starter)

8、SpringBoot多数据源拆分的思路

先在properties配置文件中配置两个数据源,创建分包mapper,使用@ConfigurationProperties读取properties中的配置,使用@MapperScan注册到对应的mapper包中

9、SpringBoot有哪些优点?

1、 快速创建独立运行的spring项目与主流框架集成
2、 使用嵌入式的servlet容器,应用无需打包成war包
3、 starters自动依赖与版本控制
4、 大量的自动配置,简化开发,也可修改默认值
5、 准生产环境的运行应用监控
6、 与云计算的天然集成

10、SpringBoot核心工作原理?

核心为@SpringBootApplication注解,主要由以下三个注解组成:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中又由@EnableAutoConfiguration为核心去自动化装配,该注解也是一个符合注解主要由:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)

其中@AutoConfigurationPackage的主要作用为扫描并加载当前项目启动类所在的package及其子package的组件。
@Import(AutoConfigurationImportSelector.class):主要作用为扫描resources/META-INF/spring.factories中配置的自动化配置类,这些自动化配置类会去生成统一的bean。(这里应用了工厂方法模式)
例如mybaits–spring-boot的resources/META-INF/spring.factories

11、SpringBoot 需要独立的容器运行吗?

可以不需要,内置了 Tomcat/ Jetty 等容器。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration,\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

      if (!AutoConfigurationPackages.has(this.beanFactory)) {
        logger.debug("Could not determine auto-configuration package, automatic mapper scanning disabled.");
        return;
      }

      logger.debug("Searching for mappers annotated with @Mapper");

      List<String> packages = AutoConfigurationPackages.get(this.beanFactory);
      if (logger.isDebugEnabled()) {
        packages.forEach(pkg -> logger.debug("Using auto-configuration base package '{}'", pkg));
      }

      BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class);
      builder.addPropertyValue("processPropertyPlaceHolders", true);
      builder.addPropertyValue("annotationClass", Mapper.class);
      builder.addPropertyValue("basePackage", StringUtils.collectionToCommaDelimitedString(packages));
      BeanWrapper beanWrapper = new BeanWrapperImpl(MapperScannerConfigurer.class);
      Set<String> propertyNames = Stream.of(beanWrapper.getPropertyDescriptors()).map(PropertyDescriptor::getName)
          .collect(Collectors.toSet());
      if (propertyNames.contains("lazyInitialization")) {
        // Need to mybatis-spring 2.0.2+
        builder.addPropertyValue("lazyInitialization", "${mybatis.lazy-initialization:false}");
      }
      if (propertyNames.contains("defaultScope")) {
        // Need to mybatis-spring 2.0.6+
        builder.addPropertyValue("defaultScope", "${mybatis.mapper-default-scope:}");
      }

      // for spring-native
      boolean injectSqlSession = environment.getProperty("mybatis.inject-sql-session-on-mapper-scan", Boolean.class,
          Boolean.TRUE);
      if (injectSqlSession && this.beanFactory instanceof ListableBeanFactory) {
        ListableBeanFactory listableBeanFactory = (ListableBeanFactory) this.beanFactory;
        Optional<String> sqlSessionTemplateBeanName = Optional
            .ofNullable(getBeanNameForType(SqlSessionTemplate.class, listableBeanFactory));
        Optional<String> sqlSessionFactoryBeanName = Optional
            .ofNullable(getBeanNameForType(SqlSessionFactory.class, listableBeanFactory));
        if (sqlSessionTemplateBeanName.isPresent() || !sqlSessionFactoryBeanName.isPresent()) {
          builder.addPropertyValue("sqlSessionTemplateBeanName",
              sqlSessionTemplateBeanName.orElse("sqlSessionTemplate"));
        } else {
          builder.addPropertyValue("sqlSessionFactoryBeanName", sqlSessionFactoryBeanName.get());
        }
      }
      builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);

      registry.registerBeanDefinition(MapperScannerConfigurer.class.getName(), builder.getBeanDefinition());
    }

12、SpringBoot几个常用的注解

@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类,完成元数据bean的初始化。
@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上
@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。

13、参考资料

SpringBoot面试题及答案https://zhuanlan.zhihu.com/p/423453161

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值