java面试题/认证答辩 ---主流框架(springboot面试题)

springboot 常见的面试题

参考:
> https://blog.csdn.net/qq_41922608/article/details/108581251
> https://blog.csdn.net/weixin_43469379/article/details/105604966

  1. springBoot的核心注解是什么?
    SpringBoot的核心注解是指启动类上面的注解 @SpringBootApplication
    @SpringBootApplication是一个复合注解,上面有三个重要的注解
    @SpringBootConfiguration @EnableAutoConfiguation @ComponentScan
    其中 @SpringBootConfiguration 组合了@Configuration注解 使用java代码形式实现spring中xml配置文件的的效果,并会将当前类的一个或者多个以@Bean注解的方法示例纳入到spring容器中
    @EnableAutoConfiguration这个注解用来开启自动配置,也是实现自动化配置的注解, 这个注解也是复合注解,其中最为主要的是@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})
    @EnableAutoConfiguration可以使用exclude()和excludeName()排除特定的自动配置类
    @ComponentScan 将指定的包路径下的找出特定标识的类加载到spring容器中,
    例如将标识了@Component @Service@Controller@Repository的类加载进spring容器中

  2. SpringBoot事务
    注意: 同一个类中使用this调用一个本类方法事务不会生效,因为调用的是本类而不是代理类,只有通过Spring代理的方法事务才生效
    可以使用((Myservice)AopContext.currentProxy()).method2(); 获取代理调用(需要在启动类上加@EnableAspectJAutoProxy(exposeProxy = true)
    @Transactional 可以作用在方法(必须是public) ,类(public方法有效),接口上(不推荐)
    事务的传播特性
    propagation共有7种传播特性
    常用的
    Required(默认) , 如果存在当前事务,则加入当前事务,如果没有则新建,两个事务同属于同一个事务,回滚则一同回滚
    requires_new// 新建事务,如果存在当前事务则挂起, 父级事务回滚不影响子级事务提交
    不常用特性
    never 不存在事务, 父级存在事务则报异常
    not_supported 以非事务运行,如果存在事务则挂起,
    supports 如果存在父级事务,则加入,如果不存在 则以非事务运行,(写不写没啥关系)
    mandatory: 强制必须有父级事务 否则报异常
    nested; 存在父级事务则作为一个子级事务,方法结束后和父级事务一起提交, 如果有异常则父级捕获异常,不影响父级事务提交

public enum Propagation {
    REQUIRED(0), // 默认 如果当前存在事务则当前加入当前事务 如果没有则新建一个事务,如果外部有事务则两个事务同属于一个事务,只要有一个回滚 整个事务都回滚
    SUPPORTS(1),  当前存在事务,则加入事务,如果没有则以非事务运行(写不写没啥区别)
    MANDATORY(2),  // 如果有有事务则运行在当前事务中,如果没有 则报错
    REQUIRES_NEW(3), //新建事务,如果存在当前事务则挂起,独立提交事务,父级异常子级依然提交
    NOT_SUPPORTED(4), // 以非事务运行,如果存在事务,则挂起事务
    NEVER(5), //以非事务方式运行,父级方法必须无事务,则抛出异常
    NESTED(6); // 存在父级事务则作为一个子级事务, 方法结束后等父级事务提交才一起提交,作为子级事务,异常可以被父级捕获,而父级不回滚, 如果父级异常 ,它必须回滚
    }
  1. SpringBoot bean生命周期
    定义 —> 初始化—>生存—> 销毁
    (1) 定义过程
    ① 资源定位,就是spring根据@Component注解找到相应的类
    ② 找到资源开始解析,将定义的信息保存起来(bean没有初始化)
    ③ 将bean的定义发布到IOC容器中, 此时spring容器中还是没有生成bean,只是定义信息
    (2)初始化
    ① 利用依赖注入,创建Bean实例对象
    (3) 生存
    (4)销毁

  2. 循环依赖问题
    循环依赖有三种情况
    (1)通过构造方法进行依赖注入时产生的循环依赖问题。
    (2) 通过setter方法进行依赖注入且是在多例(原型)模式下产生的循环依赖问题。
    (3) 通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题。(只有它被解决了,其他俩产生循环依赖都会产生异常)
    第一种情况 在构造方法注入时产生的循环依赖,在new对象的时候就被卡住了,先有蛋还是先有鸡?
    第二种,setter方法&&多例 每次getBean()都会产生一个新的对象, 循环的时候就循环产生了无限的对象,就oom了

Spring是通过三级缓存来解决循环依赖问题
三级缓存的作用
一级缓存,用于存储单例模式下已经创建完成的Bean实例
二级缓存,用于存储单例模式下的提前暴露出来的Bean的引用(bean还在创建中,对象已创建 但未注入属性和初始化)
三级缓存,存的是Bean工厂对象,用来生成半成品的Bean并放入到二级缓存中

  1. AOP实现的原理
    一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执 行;
    二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间 织入有关“方面”的代码。

你可能感兴趣的:(面试刷题,spring)