springboot 常见的面试题
参考:
> https://blog.csdn/qq_41922608/article/details/108581251
> https://blog.csdn/weixin_43469379/article/details/105604966
-
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容器中 -
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); // 存在父级事务则作为一个子级事务, 方法结束后等父级事务提交才一起提交,作为子级事务,异常可以被父级捕获,而父级不回滚, 如果父级异常 ,它必须回滚
}
-
SpringBoot bean生命周期
定义 —> 初始化—>生存—> 销毁
(1) 定义过程
① 资源定位,就是spring根据@Component注解找到相应的类
② 找到资源开始解析,将定义的信息保存起来(bean没有初始化)
③ 将bean的定义发布到IOC容器中, 此时spring容器中还是没有生成bean,只是定义信息
(2)初始化
① 利用依赖注入,创建Bean实例对象
(3) 生存
(4)销毁 -
循环依赖问题
循环依赖有三种情况
(1)通过构造方法进行依赖注入时产生的循环依赖问题。
(2) 通过setter方法进行依赖注入且是在多例(原型)模式下产生的循环依赖问题。
(3) 通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题。(只有它被解决了,其他俩产生循环依赖都会产生异常)
第一种情况 在构造方法注入时产生的循环依赖,在new对象的时候就被卡住了,先有蛋还是先有鸡?
第二种,setter方法&&多例 每次getBean()都会产生一个新的对象, 循环的时候就循环产生了无限的对象,就oom了
Spring是通过三级缓存来解决循环依赖问题
三级缓存的作用
一级缓存,用于存储单例模式下已经创建完成的Bean实例
二级缓存,用于存储单例模式下的提前暴露出来的Bean的引用(bean还在创建中,对象已创建 但未注入属性和初始化)
三级缓存,存的是Bean工厂对象,用来生成半成品的Bean并放入到二级缓存中
- AOP实现的原理
一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执 行;
二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间 织入有关“方面”的代码。
更多推荐
java面试题/认证答辩 ---主流框架(springboot面试题)
发布评论