Spring高频面试题

Spring Bean的生命周期?

bean的生命周期是指Spring容器在创建bean、管理bean时是经过实例化,初始化、依赖注入、执行业务逻辑到最终销毁bean。(源码中重点方法:doCreateBean)

  1. 实例化:Spring容器通过反射或者工厂方法创建bean实例
  2. 属性注入:Spring容器将bean的属性值依赖注入到容器中
  3. 初始化:
    1. 执行所有实现aware接口的方法
    2. 执行BeanPostProcess中bean初始化之前方法
    3. 如果bean实现了InitializingBean接⼝,Spring容器将调⽤afterPropertiesSet()⽅法;如果在bean配置中声明了init-method属性,则Spring容器将调⽤指定的⽅法。(此时就可以使⽤bean了)
    4. 执行BeanPostProcess中bean初始化之后的方法
  4. 销毁:如果bean实现了DisposableBean接⼝,Spring容器将在关闭应⽤程序上下⽂时调⽤destroy()⽅法;如果在bean配置中声明了destroy-method属性,则Spring容器将调⽤指定的⽅法。

SpringMVC执行流程?
  1. 用户发送请求,前端控制器DispatcherServlet接收请求并封装相对应的参数信息
  2. DispatcherServlet调用handlerMapping,找到具体处理器,并返回处理器调用链
  3. DispatcherServlet调用handlerAdapter处理适配器,返回handerAdapter对象ha
  4. 如果注册有拦截器,则调用拦截器的preHandle方法
  5. 通过处理器适配器调用处理器中方法,返回modelAndView对象
  6. 如果注册有拦截器,则调用拦截器的postHandle方法
  7. DispatcherServlet将ModelAndView对象传个视图解析器ViewResolver,返回View对象
  8. DispatcherServlet根据返回的View对象进行页面渲染
  9. DispatcherServlet将响应结果返回至用户

SpringBoot自动装配的原理
  1. 启动类中有@SpringBootApplication注解,底层用了三个核心注解,@SpringBootConfiguration相当于当前类为配置类,@ComponentScan默认扫描当前类所在包及其子包,@EnableAutoConfiguration这个是自动装配的关键,其底层使用了@Import注解,导入了一个实现了ImportSelector的接口实现类,

  2. @Import注解导入实现ImportSelector接⼝的实现类,低版本调⽤selectImports(),⾼版本调⽤getAutoConfigurationEntry(),读取当前项⽬下所有依赖jar包中META-INF/spring.factories、META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports两个⽂件⾥⾯定义的

    配置类,类似于SPI机制。

  3. 然后进行去重、排除、过滤等操作。

  4. 在配置类中定义⼀个@Bean标识的⽅法,还定义了@Conditional开头的注解,条件如果满⾜,Spring

    会⾃动调⽤配置类中@Bean标识的⽅法,并把⽅法的返回值注册到IOC容器中


Spring事务隔离级别?事务失效场景?如何改变传播⾏为?
1、事务隔离级别

读未提交、读已提交、可重复读和串⾏化,使⽤@Transactional注解的isolation属性来控制事务的隔离级别。

2、事务失效(aop代理的)
  1. 事务使⽤在静态⽅法上会失效

  2. 事务使⽤在⾮public上(访问权限问题)

  3. 事务中对异常进⾏捕获,出现异常后spring框架⽆法感知到异常,事务就会失效

  4. ⽅法⽤ final 修饰

  5. ⽅法内部调⽤

  6. 未被 spring 管理

  7. 多线程调⽤

  8. 表不⽀持事务

3、事务传播行为
  1. REQUIRED:如果当前存在⼀个事务,则加⼊该事务;否则创建⼀个新的事务。这是默认传播

⾏为。(默认)

  1. SUPPORTS:如果当前存在⼀个事务,则加⼊该事务;否则以⾮事务的⽅式执⾏。

  2. MANDATORY:如果当前存在⼀个事务,则加⼊该事务;否则抛出异常。

  3. REQUIRES_NEW:创建⼀个新的事务,如果当前存在事务,则将当前事务挂起。

  4. NOT_SUPPORTED:以⾮事务⽅式执⾏操作,如果当前存在事务,则将当前事务挂起。

  5. NEVER:以⾮事务⽅式执⾏,如果当前存在事务,则抛出异常。

  6. NESTED:如果当前存在事务,则在嵌套事务内执⾏。如果当前没有事务,则执⾏与REQUIRED类似的操作

  7. 使⽤@Transactional注解的propagation属性来控制事务的传播⾏为

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值