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的一种扩展,是对复杂对象 初始化创建的过程。

相关文章
|
15天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
45 2
|
4天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
28 14
|
20天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
28天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
26天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
22天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
44 4
|
23天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
76 4
|
22天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
31 0
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
79 2