Java面试准备-Spring篇

简介: Java面试准备-Spring篇

什么是Spring


Spring 是Java企业级应用的开源开发框架,Spring主要用于开发Java应用,简化Java企业级应用开发。

项目中为什么要用Spring


直接说Spring的好处

轻量级

轻量:首先Spring是轻量级的IOC和AOP容器框架,是为Java应用程序提供基础服务的一套框架,目的是简化企业级应用开发,使开发者只关心业务需求,常见的配置有3种:基于XML的配置、基于注解的配置、基于Java的配置。

核心模块:

Spring Core:提供IOC服务

Spring AOP:面向切面

Spring DAO:对JDBC的封装

Spring ORM:对ORM框架的支持

Spring Web:提供了基本面向Web的特性,如多文件上传

Spring MVC:MVC开发。


Autowired 和 Resource 有什么区别


两个注解都是做为Bean的注入使用

Autowired 是Spring的注解、Resource 是有J2EE提供,但Spring支持该注解的注入。

Autowired 只支持按照byType进行注入,Resource 默认是按照byName进行注入。

Resource 的作用相当于 Autowired ,这是他们的注入方式不一致。


依赖注入的方式有几种,分别是什么


构造器注入:将依赖的对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。

优点:初试化完成即可使用对象

缺点:注入对象很多时,构造参数列表会很长。

setter方法注入:通过提供的成员变量setter函数进行注入。

优点:灵活,可以选择性的注入需要的对象。

缺点:尚未完成注入,不能立即使用

接口注入:依赖类必须要实现指定的接口。

说说你对MVC的一个理解


image.png

M-model:完成业务逻辑、service+dao+entity

V-view:视图、界面的展示 html、jsp等

C-controller:控制器、转发。

springMVC 是 Spring后续的产品,其实就是Spring在原有的基础上增加了对Web模块的支持。

工作原理:

用户发送请求到前端控制器DispatcherServlet

DispatcherServlet收到请求调用HandlerMapping处理器

处理器映射器找到具体的处理器,生成相关对象一并返回给DispatcherServlet

DispatcherServlet调用HandlerAdapter处理器进行适配

HandlerAdapter经过适配调用具体的控制器

控制器执行完成过后返回给视图

HandlerAdapter将控制器的执行结果返回给DispatcherServlet

DispatcherServlet将视图传给ViewReslover视图解析器

ViewReslover解析后返回给具体的View

DispatcherServlet根据View进行渲染

DispatcherServlet响应用户

组件说明 :

DispatcherServlet:做为前端控制器,整个流程的控制中心,控制其他组件执行,统一调度。

HandlerMapping:处理映射器,根据请求的url查找HandlerMapping

hander:自己处理的逻辑代码

HandlerAdapter:扩展处理器适配器,适配器设计模式。

ViewReslover:视图解析器,jsp、freemarker等


Spring AOP的理解


Spring AOP是面向切面的,能够将那些与业务无关,却为业务逻辑共同调用的(日志处理、事务处理、权限控制),便于减少系统重复的代码,并有利于未来的可扩展性和可维护下。

Spring AOP是基于动态代理,如果要代理的对象实现了某个接口,那么就采用JDK动态代理去代理对象,如果没有实现接口,则无法使用JDK实现动态代理,转而使用CGlib动态代理,生成一个被代理对象的子类作为代理。

JDK只提供接口代理、不支持类的代理。

调用时:先去调用处理类进行增强,再通过反射的方式调用目标方法,从而实现AOP

CGlib是通过继承的方式实现动态代理的,如果某个类被表示为final,那么无法使用CGlib进行动态代理。

JDK的代理性能更好。


Spring AOP和AspectJ AOP有什么区别


Spring AOP属于运行时增强,AspectJ属于编译增强

Spring AOP基于动态代理,AspectJ基于字节码操作

Spring AOP已经集成了AspectJ、AspectJ功能更加强大,但Spring AOP使用起来更加简单。


什么是切面通知呢,有哪些类型


通知实在方法执行前或者执行后要做的动作,实际就是程序需要通过AOP触发的代码段。

Spring切面有5中类型的通知

before:前置通知,在方法前被执行

after:在方法执行之后调用的通知,无论方法是否执行成功

after-returning:方法执行成功执行通知

after-throwing:在方法抛出异常退出时执行的通知

around:在方法执行前和执行后的通知


Spring IOC的理解


IOC控制反转,是指创建对象的控制权转移,以前创建对象的主动权都是由自己把控,而现在这种权利转移到Spring进行把控,并由容器去创建实例和管理实例之间的依赖关系。对象与对象之间的松散耦合,也利于功能的复用。

最直接的表达就是,IOC让对象创建不用自己去new了,可以由Spring自动产生,使用Java的反射机制,根据配置文件在运行时动态的去创建和管理对象,并调用对象的方法。

Spring IOC的三种注入方式:构造器注入、setter方法注入、接口注入。


Spring bean的生命周期


实例化Bean:对于BeanFactory容器,通过获取BeanDifination对象信息,进行实例化。

设置对象属性(依赖注入): BeanWrapper完成依赖注入

处理Aware接口:

BeanPostProcessor:

InitializingBean 与 init-method

DisposableBean

destroy-method


Spring 支持几种Bean的作用域


singleton:默认,每个容器只有一个Bean的实例。

prototype:为每个Bean请求提供一个实例

request:每个网络创建一个实例,请求完成后,被垃圾回收器回收。

session:与request类似,确保每个session中有一个Bean的实例。

global-session:全局作用域。


Spring中用到了哪些设计模式


简单工厂模式:BeanFactory、通过传入一个唯一标识来获取Bean对象。

工厂模式:FactoryBean、

单例模式:scope=“singleton”

原型模式:scope=“prototype”

代理模式:基于JDK和CGlib的动态代理

适配器模式:MVC中的Adapter

模板方法模式:JdbcTemplate


说说Spring 中 ApplicationContext 和 BeanFactory 的区别


包目录不同:一个来源bean包,一个来源context包

国际化:BeanFactory 没有实现MessageResource接口,不支持国际化、ApplicationContext 支持。

强大的事件机制:ApplicationContext 强大的事件机制,通过观察者设计模式来实现。

对web应用的支持:BeanFactory通常以编程的方式进行创建、ApplicationContext以声明试创建,如ContextLoader。

延迟加载:BeanFactroy是通过延迟来注入Bean的。

ApplicationContext继承了BeanFactory ,BeanFactory是Spring比较原始的Bean,ApplicationContext是对BeanFactory很好的扩展。

Spring中的单例Bean是线程安全的吗

关于单例Bean是否是线程安全和并发问题,需要我们自己去解决


Spring只管Bean的创建,可以根据参数进行配置


实际上大部分的Bean都没有可变状态,所以从某种程度来说单例Bean是线程安全的,如果Bean有多种状态的话,需要自行保证Bean的线程安全,就是把Bean的作用域由Singleton配置为Prototype。


Spring是怎么解决循环依赖的


比如:A依赖B、B依赖C、C依赖A

首先A完成初始化,将自己提现曝光 ,在初始化的时候发现依赖B,然后去尝试获取B,但是这个时候B还没有被初始化

然后B走创建流程,发现B又依赖C,C还没有被创建

这个时候C开始走初始化流程,但是这个时候发现依赖A,这个时候A已经添加到缓存中,然后通过ObjectFactory#getObject() 拿到A对象,C拿到A对象顺利完成初始化,然后将自己添加到一级缓存中。

回到B,B也可以拿到C完成初始化,A也可以顺利拿到B进行初始化。

三级缓存、提前曝光。


说说事务的隔离级别


未提交读(Read Uncommit):脏读,可能读取到其他事务没有提交的数据。

提交读(Read Commit):只能读到已提交的数据。

可重复读(Repeated Read):存在幻读(多个事务修改同一条记录,彼此之间不知道,当事务提交后,后面的事务会覆盖前面的事务)

串行化(Serializable):读写都会阻塞。


事务的传播级别


spring 默认的传播级别:如果当前存在事务就加入,不存在就创建。

新老事务隔离,外部事务抛异常不影响内部事务。

Spring事务实现方式

编程式事务管理:灵活性强,维护性低

声明式事务:事务与业务代码分离,用得比较多。


事务的三要素


数据源:表示具体的事务资源,是事务真的处理者。

事务管理器:打开、提交、回滚

事务应用和属性配置:哪些方法参与事务、隔离级别、超时时间等


事务的本质是什么


@Transactional 仅仅是一个事务元数据、声明试事务主要通过 Spring AOP来实现,做为一个拦截器,包括方法调用前、调用后来完成。

事务不生效的几种可能:

方法不是public的

自己catch了异常

数据库引擎不支持事务


BeanFactory和FactoryBean的区别


BeanFactory ,是IOC容器最底层接口,是负责生产和管理Bean的一个工厂接口,提供Spring IOC的容器规范。

FactoryBean:创建Bean的一种方式,是对Bean的一种扩展,是对复杂对象 初始化创建的过程。

相关文章
|
6天前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
4天前
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
4天前
|
存储 缓存 网络协议
复盘女朋友面试4个月的Java基础题
这篇文章是关于Java基础面试题的复盘,涵盖了HashMap原理、对象序列化作用等高频面试问题,并强调了Java基础知识的重要性。
复盘女朋友面试4个月的Java基础题
|
6天前
|
存储 NoSQL Java
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这篇文章是关于Java面试中的分布式架构问题的笔记,包括分布式架构下的Session共享方案、RPC和RMI的理解、分布式ID生成方案、分布式锁解决方案以及分布式事务解决方案。
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
|
1天前
|
安全 前端开发 Java
随着企业应用复杂度提升,Java Spring框架以其强大与灵活特性简化开发流程,成为构建高效、可维护应用的理想选择
随着企业应用复杂度提升,Java Spring框架以其强大与灵活特性简化开发流程,成为构建高效、可维护应用的理想选择。依赖注入使对象管理交由Spring容器处理,实现低耦合高内聚;AOP则分离横切关注点如事务管理,增强代码模块化。Spring还提供MVC、Data、Security等模块满足多样需求,并通过Spring Boot简化配置与部署,加速微服务架构构建。掌握这些核心概念与工具,开发者能更从容应对挑战,打造卓越应用。
6 1
|
4天前
|
存储 缓存 Java
复盘女朋友面试4个月的Spring面试题
该文章复盘了关于 Spring 的面试题,包括 Spring 的好处、Bean 的生命周期、Spring 循环依赖的解决方法、AOP 的原理以及 Spring Boot 自动装配的原理等,强调对 Spring 核心原理的清晰理解对于回答面试题的重要性。
复盘女朋友面试4个月的Spring面试题
|
6天前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
6天前
|
存储 关系型数据库 MySQL
一天五道Java面试题----第八天(怎么处理慢查询--------->简述Myisam和innodb的区别)
这篇文章是关于Java面试中关于数据库性能优化和MySQL特性的五个问题,包括处理慢查询、ACID特性保证、MVCC概念、MySQL主从同步原理以及MyISAM和InnoDB存储引擎的区别。
|
5天前
|
NoSQL Java 数据库
2022年整理最详细的java面试题、掌握这一套八股文、面试基础不成问题[吐血整理、纯手撸]
这篇文章是一份详尽的Java面试题总结,涵盖了从面向对象基础到分布式系统设计的多个知识点,适合用来准备Java技术面试。
|
5天前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。