【java八股文】之Spring系列篇

这篇具有很好参考价值的文章主要介绍了【java八股文】之Spring系列篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【java八股文】之JVM基础篇-CSDN博客

【java八股文】之MYSQL基础篇-CSDN博客

【java八股文】之Redis基础篇-CSDN博客

【java八股文】之Spring系列篇-CSDN博客

【java八股文】之分布式系列篇-CSDN博客

【java八股文】之多线程篇-CSDN博客

【java八股文】之JVM基础篇-CSDN博客

【java八股文】之计算机网络系列篇-CSDN博客

1、你怎么理解Spring?

Spring是个轻量级的框架,简化了应用的开发程序,提高开发人员的系统维护性,不过配置消息比较繁琐,所以后面才出选了SpringBoot的框架。

Spring的核心组件 : Spring Core 、 Spring Context 、 Spring Beans

IOC是Bean的一个容器,Context是每个Bean之间依赖的关系。正是因为各种Bean建立的关系我们才构成了IOC容器为我们服务,而Core就是维护、建立和维护所需要的的工具。

2、Spring中的Bean 是线程安全的吗?

非安全的

  • 原型Bean

对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。

  • 单例Bean

对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。

如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。

但是如果Bean是有状态的 那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域 把 "singleton"改为’‘protopyte’ 这样每次请求Bean就相当于是 new Bean() 这样就可以保证线程的安全了。

  • 有状态就是有数据存储功能
  • 无状态就是不会保存数据 controller、service和dao层本身并不是线程安全的,只是如果只是调用里面的方法,而且多线程调用一个实例的方法,会在内存中复制变量,这是自己的线程的工作内存,是安全的。
  • 所以其实任何无状态单例都是线程安全的。

3、Spring单例,为什么controller、service和dao确能保证线程安全?


Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理。

实际上大部分时间Bean是无状态的(比如Dao) 所以说在某种程度上来说Bean其实是安全的。

4、什么是IOC和AOP,你知道他们的原理吗?

IOC:IOC就是控制反转,是一种思想而不是技术实现,A类对象中需要B类对象,传统是自己手动new就是主动控制,IoC思想就是交给IoC容器管理,不再自己手动new,容器管理好对象以及依赖关系,需要的时候从容器里拿就行。

IOC原理:就是在给每一个bean进行实例化后,都要对他的属性进行填充,大多数我们都是使用@Autowire直接的填充依赖注入的,在实例化和实例化后之间会调用一个MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition一个寻找注入点的方法,然后在属性填充时候,首先是按照注入点的类型去寻找如果有多个选择@Qualifier注解寻找,如果还是有多个按照@Primary,@Priority,最后还是没有筛选出来一个唯一的注入就按照名字来查找。

AOP:是面向切面的编程,AOP就是可以将那些与业务不相关但是很多业务都要调用的代码抽取出来封装起来,减少重复代码,思想就是不侵入原有代码的情况下对功能进行增强。

AOP原理:SpringAOP是基于动态代理的,其中SpringAOP的底层的动态代理有两种方式,一种是对于实现接口的JDK Proxy方式,另外一种就是CgLib。

Aspect:表示切面,比如被@Aspect注解的类就是切面,可以在切面中去定义Pointcut、Advice等等。


Join point:表示连接点,表示一个程序在执行过程中的一个点,比如一个方法的执行,比如一个异常的处理,在Spring AOP中,一个连接点通常表示一个方法的执行。


Advice:表示通知,表示在一个特定连接点上所采取的动作。Advice分为不同的类型,后面详细讨论,在很多AOP框架中,包括Spring,会用Interceptor拦截器来实现Advice,并且在连接点周围维护一个Interceptor链。


Pointcut:表示切点,用来匹配一个或多个连接点,Advice与切点表达式是关联在一起的,Advice将会执行在和切点表达式所匹配的连接点上。


Introduction:可以使用@DeclareParents来给所匹配的类添加一个接口,并指定一个默认实现。


Target object:目标对象,被代理对象。


AOP proxy:表示代理工厂,用来创建代理对象的,在Spring Framework中,要么是JDK动态代理,要么是CGLIB代理。


Weaving:表示织入,表示创建代理对象的动作,这个动作可以发生在编译时期(比如Aspejctj),或者运行时,比如Spring AOP。

4、bean 的生命周期?

  • 首先通过扫描包路径,通过ASM技术获取到类的信息,封装成BeanDefintion注册到Spring容器当中(这个操作其实就是BeanFactory的后置处理器操作)
  • 然后就可以进行类的加载,进行类的实例化前操作、推断构造方法、实例化、实例化后、填充属性。(值得注意的是再实例化和实例化后之间有个BeanDefinction的后置处理器,这个后置处理器就是我们@Autowire的寻找注入点的迁前置操作。依赖注入就是再实例化后的操作)
  • 最后就进行执行Aware回调、初始化前、初始化、初始化后(代理逻辑)操作
  • 最后就是bean的销毁操作

5、Bean实例化的时候是如何解决循环依赖?

循环依赖就是在创建A实例的时候里面包含着B属性实例,所以这个时候就需要去创建B实例,而创建B实例过程中也包含着A实例。 这样A实例还在创建的过程当中,所以就导致A和B实例都创建不出来。

  • 一级缓存 就是我们所说的Bean存储的经过完整的生命周期的单例池
  • 二级缓存 缓存未经过完整的声明周期的Bean
  • 三级缓存 缓存的是ObjectFactory其实存储的是一个动态代理类的一个实现类的拉姆达表达式,执行这个拉姆达表达式就会生成这个类的代理类。

6、Bean实例化的三级缓存了解吗?

有了这三级缓存我们就来看一看,他是如何解决的。

如果出现了循环依赖的问题,我们在创建A的过程中,需要创建B。这个时候就需要将A放入三级缓存并且不会执行那个拉姆达表达式,所以这个时候需要去创建B在创建B时候需要去依赖A,就直接去三级缓存中查找,并且判断需不需要进行AOP处理,如果需要就执行那个拉姆达表达式得到代理对象,如果不需要就不需要执行,直接取出原始的对象。将取出的对象放入二级缓存中,因为这个时候A还未经过完整的生命周期所以不能放入一级缓存。这个时候其他需要依赖A对象的直接从二级缓存中去获取即可。当B创建完成,A继续执行生命周期,当A完成了属性的注入后,就可以放入一级缓存了。

7、SpringMVC的工作原理

  • 客户端(浏览器)发送请求,直接请求到 DispatcherServlet。
  • DispatcherServlet 根据请求信息调用并且找到对应的HandlerMapping,解析请求对应的 Handler。
  • 然后利用对应的适配处理器,并且调用处理器开始执行,执行过程中包括解析参数,返回ModelAndView
  • Model 是返回的数据对象,View 是个逻辑上的 View
  • ViewResolver 会根据逻辑 View 查找实际的 View。
  • DispaterServlet 把返回的 Model 传给 View(视图渲染)。

8、Spring的事务实现方式?事务隔离级别?事务传播机制?

spring事务是在启动类上加一个@Configuration 和 @EnableTransactionManagement注解,然后再Service的方法上面加一个@Transactional注解就可以了。

Spring使用的事务隔离级别默认是使用MySQL数据库的隔离级别。

事务的传播机制:

8.1 当前不存在事务

  • requiresd 新建一个事务
  • requires_new 新建一个事务
  • nested 新建一个事务
  • mandatory 抛异常

8.2 当前存在事务

  • requiresd 加入这个事务
  • requires_new 把当前事务挂起,然后新建一个事务
  • nested 记录一个SavePoint,创建一个事务作为当前事务的嵌套事务来运行外部主事务回滚的话,子事务也会回滚,而内部子事务可以单独回滚而不影响外部主事务和其他子事务。
  • mandatory 加入该事务
  • never 以非事务方式运行,如果当前存在事务,则抛出异常。

9、讲一下SpringBoot里面比较常用的注解?

@configuration

@handmapping

@getmapping

@postmapping

@EnableTransactionManagement

@mapperScaner

@commpoent

@requestBody

@restcontroller

10、MyBatis的 # 和 $ 有什么区别?

  • ${}是properties文件的变量占位符,用于标签属性值和SQL内部,比如${driver}会被替换成com.mysql.jdbc.Driver。
  • #{}是SQL的参数占位符,实际上会被替换成 ?

11、SpringBoot 是如何实现自动装配的?


@SpringBootApplication下有三个注解:文章来源地址https://www.toymoban.com/news/detail-798685.html

  • @SpringBootConfiguration:启用 SpringBoot 的配置类,相当于是Spring中的一个配置文件,比如说可以在这个类去注册bean,或者导入其他的配置类
  • @ComponentScan:用于扫描启动类包下面的所有类的注解信息,并且注册
  • @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制,获取需要自动装配的所有配置类,读取所有的Start中的META-INF/spring.factories,按需加载到IOC容器中。

12、什么情况下会出现事务失效场景?

  • 数据库引擎不支持事务
  • 传播机制不支持事务,就是不以事务的情况运行
  • 没有配置事务管理器数据源
  • 没有被 Spring 管理
  • 方法不是 public 的 @Transactional 只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。
  • 自身调用问题
  • 异常被捕获了
  • 异常的类型不匹配,默认是运行时的异常

到了这里,关于【java八股文】之Spring系列篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【java八股文】之计算机网络系列篇

    TCP/IP分层(4层): 应用层,传输层,网络层,数据链路层 网络的七层架构 (7层) :应用层,表示层,会话层,传输层,网络层,数据链路层,物理层 五层协议 (5层): 物理层、数据链路层、网络层、运输层、 应用层 TCP/IP是面向连接的协议,发送数据前要先建立好连接

    2024年01月16日
    浏览(47)
  • Java 八股文面试过程系列之synchronized关键字

    本文通过一场虚拟的面试对话,详细解析了Java中的synchronized关键字。从基本用法到底层实现原理,再到性能优化策略,全面提升您对同步机制的理解。

    2024年02月07日
    浏览(52)
  • 【面试系列】八股文之线程篇202306

    union all :包含重复行 union :不包含重复行 shutdown() ,调用shutdown方法,线程池会拒绝接收新的任务,处理中的任务和阻塞队列中的任务会继续处理。 shutdownNow() ,会给workers中所有的线程发送 interrupt 信号,将延迟队列的任务移除并返回。 原理分析 执行任务,尝试添加线程。

    2024年02月12日
    浏览(46)
  • Java八股文

    相似点 接口和抽象类都不能被实例化 实现接口或者抽象类的子类都必须实现这些抽象方法 不同点 抽象类可以包含普通方法和代码块, 接口里只能包含抽象方法, 静态方法和默认方法 抽象类可以有构造方法, 而接口没有 抽象类中的成员变量可以是各种类型, 接口中的成员变量

    2023年04月23日
    浏览(45)
  • Java 面试八股文

    参考: 2023年 Java 面试八股文(20w字)_json解析失败_leader_song的博客-CSDN博客

    2024年02月13日
    浏览(56)
  • Java面试必备八股文

    1.1)Java有哪几种数据类型 基本数据类型:byte(1字节) short(2字节) int(4字节) long(8字节) float(4字节) double(8字节) char(2字节) boolean(1字节) 引用数据类型:String 类 接口 抽象类 枚举 数组 1.2)JVM、JRE和JDK的关系 JVM指的是Java的虚拟机,Java程序需要运行在虚拟机上

    2023年04月08日
    浏览(53)
  • java八股文-并发篇

    要求 掌握 Java 线程六种状态 掌握 Java 线程状态转换 能理解五种状态与六种状态两种说法的区别 六种状态及转换 分别是 新建 当一个线程对象被创建,但还未调用 start 方法时处于 新建 状态 此时未与操作系统底层线程关联 可运行 调用了 start 方法,就会由 新建 进入 可运行

    2024年02月08日
    浏览(42)
  • Java 八股文-基础篇

    1.什么是 Java? Java 是一门面向对象的编程语言,不仅吸收了 C++语言的各种优点,还摒弃了 C++里难以理解的多继承、指针等概念,因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的优秀代表,极好地实现了面向对象理论,允许程序员以优

    2024年02月08日
    浏览(48)
  • Java 八股文 - MySQL

    ​ 三种锁的特点 表级锁 :开销小,加锁快;不会出现死锁;锁定颗粒度大,发生锁冲突的概率最高,并发度最低。 行级锁 :开销大,加锁慢;会出现死锁;锁定颗粒度最小,发生所冲突的概率最低,并发度也最高 页面锁 :开销和加锁时间介于表所和行锁之间;会出现死锁

    2024年02月08日
    浏览(47)
  • Java八股文(Elasticsearch)

    什么是Elasticsearch? Elasticsearch是一个开源的分布式搜索和分析引擎,用于实时存储、搜索和分析大规模数据集。 Elasticsearch的主要特点是什么? Elasticsearch的主要特点包括: ● 分布式和高可用性:支持数据在多个节点上的水平分片和复制。 ● 实时搜索和分析:能够实时索引

    2024年04月17日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包