谈谈你对spring的理解

  • spring是java的一个轻量级框架,解决企业开发的问题,使开发者可以更加专注于开发
  • spirng提供了很多功能,底层依赖于两个特性,DI(Dependency Injection)和AOP(Aspect-Oriented Programming)
  • IOC控制反转,指对象的调用权由开发者转为Spring容器,负责对象的所有生命周期(创建,管理等)
  • 为什么需要IOC?最重要的就是解耦。
  • 如何实现?工厂 + 反射
  • IOC是设计理念,DI是实现方式。有接口注入,setter注入和构造器注入
  • AOP的出现解决了代码重复的问题,并进行了解耦
  • AOP作为OO(面向对象)的一种补充,常用与业务行为无关,对公共逻辑进行封装,并命名为切面(Aspect)。常用于日志,权限认证和事务处理等

spring分为了多少个模块,或者说能干什么?

图片详细见spring.io

  • spring core:框架核心部分,包括IOC(Inversion of Control)和DI

spring中使用了哪些设计模式?

  • 工厂:beanFactory
  • 单例:默认为单例模式
  • 代理:AOP用到了JDK代理和CGLIB代理
  • 模版:比如RestTemplate,JpaTemplate等,解决重复代码问题
  • 观察者:各种监听器
  • 适配器:SpringMVC过程

谈谈springboot自动配置原理

空降地址

springbootapplication = springbootconfiguration + commentscan + enableautoconfiguration

enableautoconfiguration = import + autoconfigurationpackage

刷新IOC容器,调用getImports方法,将import注解中的组件进行实例化

谈谈@Transactional注解

  • 事务分为编程式事务(手动提交回滚,侵入性强)和声明式事务(AOP)
  • 只对public起效,由springAOP决定的,拦截处理,可能影响性能
  • 基于spring的AOP机制

隔离级别—4种

指若干个并发事务的隔离程度—从前往后没

  • 读取未提交(会出现脏读、不可复读)—基本不使用
  • 读取已提交(会出现不可复读和幻读)
  • 可重复读(会出现幻读)—默认级别
  • 串行化

事务的传播—7种

如果在事务开始前,一个事务已经存在,此时可以指定该事务的行为

  • PROPAGATION_REQUIRED 如果存在事务,则加入该事务,如果没有,则新建一个。—默认值
  • PROPAGATION_REQUIRES_NEW 创建一个新的,如果有事务,则把当前事务挂起
  • PROPAGATION_SUPPORTS 如果存在事务,则加入该事务,如果没有则以非事务的方式继续
  • PROPAGATION_NOT_SUPPORT 不用事务,如果当前有,则挂起
  • PROPAGATION_NERVER 不用事务,有事务就抛异常
  • PROPAGATION_MANDATORY 如果有则加入,没有就抛异常
  • PROPAGATION_NESTED 如果有就嵌套一个,没有则创建一个

Transactional的失效场景

  • 作用在非public方法上
  • 注解的propagation设置错误(support,notsupport,nerver)
  • rollbackfor设置错误(指定回滚类型)比如自己设置的异常不会回滚
  • 本类方法进行了调用,A没有事务注解,B有,A调用了B,外部方法调用了A
  • 自己在方法内catch了异常
  • 数据库引擎不支持事务

熔断器的过程

  1. 到达一定阈值(默认10秒超过20个请求)
  2. 到达一定失败率(20个请求10个失败)
  3. 断路器开启,所有请求将不会转发
  4. 一段时间后(默认5秒),先放一个请求,如果成功,断路器关闭,如果失败,则继续开启

谈谈对springMVC的理解

对servlet进行了封装,屏蔽掉很多的细节。mvc的一个过程
20211011184813

  1. 用户发送请求给DispatcherServlet
  2. 向HandlerMapping索要对应的请求处理器
  3. HandlerMapping返回给相应的处理器
  4. DispatcherServlet给HandlerAdpater传入一个handler
  5. 适配器返回一个能够处理该请求的适配器
  6. 利用该适配器去处理并得到ModelAndView视图对象
  7. 返回给DispatcherServlet视图对象
  8. 使用ViewRouter进行视图解析
  9. ViewRouter返回给view对象
  10. DispatcherServlet渲染视图,将视图呈现给用户

谈谈spring的IOC

IOC就是控制反转,指对象的管理权由程序员变为spring管理,用来解决对象管理和依赖的问题

IOC可以理解为一个对象工厂,控制反转是一种思想,而依赖注入就是实现方式了,最大的好处就降低耦合度

在注入一个对象时,很可能不是原本的对象而是代理对象(使用到了AOP)

谈谈spirng的AOP

AOP面向切面编程,将切面功能与核心业务编织在一起,常用于日志,事务处理,权限控制等,减少系统重复代码,降低耦合度,提供拓展性和可维护性

底层利用动态代理实现,如果代理的对象实现了某个接口,那么就会使用jdk代理,否则使用cglib代理

AOP如何进行切入的,通过beanPostProcessor后置器类来干预

BeanDefinition

CLASS定义了这个类有哪些属性方法,但没有定义如何实例化这个bean,比如是否单例,是否延迟加载,调用哪个初始化/销毁方法

spring如何处理线程并发问题?

一般情况下,只有无状态的bean才可以在多线程环境下共享,在spring中,绝大部分bean都可以声明为singleton作用域,因为spring对一些bean中非线程安全状态采用ThreadLocal进行处理,解决县城安全问题。

ThreadLocal和线程同步机制都是为了解决多线程中共享变量的访问冲突问题。同步机制采用了时间换空间的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的则需要进行排队。而ThreadLocal采用了空间换时间的方式

ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程编码时,可以把不安全的变量封装进ThreadLocal中

能讲讲spring的生命周期吗

一般对象的生命周期:new创建 — JVM回收

spirng的生命周期如下图

springbean

容器创建过程描述

  1. spring对bean进行实例化
  2. 将值和引用注入到bea所对应的属性中
  3. Spring将bean的ID传递给setBean-Name()
  4. 如果bean实现了BeanFactoryAware接口,将调用setBeanFactory()
  5. 调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来
  6. 调用它们的post-ProcessBeforeInitialization()方法
  7. 调用它们的after-PropertiesSet()方法。类似地,如果bean使用initmethod声明了初始化方法,该方法也会被调用
  8. 此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁
  9. 调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用

谈谈开发中常用的@Autowired是怎么发挥作用的

可以见这篇文章

知道@Autowired和@Resource之间的区别吗?

  • @Autowired是spring提供的,@Resource是Java提供的
  • @Autowired按类型装配,@Resource按名称装配

扩展

更多内容可点击参照这篇文章