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

相关文章
|
3月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
168 1
|
2月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
323 0
|
3月前
|
IDE Java 数据库连接
解决Java环境中无法识别org.mybatis.spring.annotation.MapperScan的问题。
祝你好运,在这场MyBatis的魔法冒险中获得胜利!记住,魔法书(官方文档)永远是你最好的朋友。
254 18
|
2月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
96 2
|
3月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
98 5
|
3月前
|
Java API 微服务
2025 年 Java 校招面试全攻略:从面试心得看 Java 岗位求职技巧
《2025年Java校招最新技术要点与实操指南》 本文梳理了2025年Java校招的核心技术栈,并提供了可直接运行的代码实例。重点技术包括: Java 17+新特性(Record类、Sealed类等) Spring Boot 3+WebFlux响应式编程 微服务架构与Spring Cloud组件 Docker容器化部署 Redis缓存集成 OpenAI API调用 通过实际代码演示了如何应用这些技术,如Java 17的Record类简化POJO、WebFlux构建响应式API、Docker容器化部署。
126 5
|
3月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
174 6
|
3月前
|
安全 Java API
2025 年 Java 校招面试常见问题及详细答案汇总
本资料涵盖Java校招常见面试题,包括Java基础、并发编程、JVM、Spring框架、分布式与微服务等核心知识点,并提供详细解析与实操代码,助力2025校招备战。
160 1
|
3月前
|
算法 Java 微服务
2025 年 Java 面试宝典社招春招秋招实操全方位攻略
2025年Java面试宝典涵盖核心技术及最新趋势,分为四大板块:1. Java基础:深入数据类型、多态等特性,结合学生信息管理等实例;2. JVM核心:解析内存模型与GC算法,附多线程转账等场景应用;3. 高并发方案:详解synchronized与线程池配置,提供Web服务器优化案例;4. Spring生态:剖析IoC/AOP原理,演示微服务架构实现。特别新增Java 17+特性实操,包括Record类、密封接口等语法糖,整合Spring Boot 3、响应式编程及云原生技术,通过订单状态机、API网关配置。
222 1
|
3月前
|
Java 数据库连接 API
Java 对象模型现代化实践 基于 Spring Boot 与 MyBatis Plus 的实现方案深度解析
本文介绍了基于Spring Boot与MyBatis-Plus的Java对象模型现代化实践方案。采用Spring Boot 3.1.2作为基础框架,结合MyBatis-Plus 3.5.3.1进行数据访问层实现,使用Lombok简化PO对象,MapStruct处理对象转换。文章详细讲解了数据库设计、PO对象实现、DAO层构建、业务逻辑封装以及DTO/VO转换等核心环节,提供了一个完整的现代化Java对象模型实现案例。通过分层设计和对象转换,实现了业务逻辑与数据访问的解耦,提高了代码的可维护性和扩展性。
155 1

热门文章

最新文章