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

相关文章
|
22小时前
|
前端开发 Java 数据库连接
Java与Spring框架的深度融合
Java与Spring框架的深度融合
|
2天前
|
前端开发 Java 开发者
Spring 框架:Java 企业应用开发领域的“隐形冠军”!
【6月更文挑战第25天】Spring框架在Java开发中扮演重要角色,提倡依赖注入、事务管理及面向切面编程的最佳实践。例如,通过`@Autowired`实现接口注入,保持代码松耦合;使用`@Transactional`确保数据一致性;借助`@Aspect`定义AOP切面,分离关注点;使用Java配置增强可维护性;以及在Spring MVC中利用注解驱动提升Web应用效率。遵循这些最佳实践,开发者能打造高效、可扩展的应用。
|
16小时前
|
XML Java 开发者
“掌握Spring IoC和AOP:30道面试必备问题解析!“
“掌握Spring IoC和AOP:30道面试必备问题解析!“
7 0
|
16小时前
|
安全 Java 中间件
《面试专题-----经典高频面试题收集一》解锁 Java 面试的关键:深度解析常见高频经典面试题(第一篇)
《面试专题-----经典高频面试题收集一》解锁 Java 面试的关键:深度解析常见高频经典面试题(第一篇)
6 0
|
16小时前
|
安全 Java API
《面试专题-----经典高频面试题收集三》解锁 Java 面试的关键:深度解析并发编程基础篇高频经典面试题(第三篇)
《面试专题-----经典高频面试题收集三》解锁 Java 面试的关键:深度解析并发编程基础篇高频经典面试题(第三篇)
4 0
|
1天前
|
Java
Java中的面试常见问题解析
Java中的面试常见问题解析
|
2天前
|
XML 监控 Java
Java中的AOP编程:AspectJ与Spring AOP的应用
Java中的AOP编程:AspectJ与Spring AOP的应用
|
2天前
|
Java 开发者 Spring
Spring 框架:Java 企业应用开发的“瑞士军刀”,一网打尽所有需求!
【6月更文挑战第25天】Spring框架是Java开发的“瑞士军刀”,以其DI(依赖注入)减少手动管理,提高效率。AOP(面向切面编程)实现非侵入式关注点分离,如日志和事务管理。@Transactional注解简化事务处理,Web支持使Web应用开发更便捷。通过这些工具,Spring解决了复杂需求,增强了代码的可维护性和性能。
|
2天前
|
Java 数据库 Spring
解锁 Spring 框架新姿势,让你的 Java 代码更加优雅!
【6月更文挑战第25天】在Spring框架中优化依赖注入、应用AOP和事务管理能提升代码优雅性。例如,使用构造函数注入降低耦合,如将手动创建改为容器管理;通过AOP实现横切关注点,如统一日志记录,避免重复代码;利用`@Transactional`注解简化事务处理,确保数据一致性。这些技巧让代码更简洁、可维护。
|
13天前
|
前端开发 JavaScript Java
计算机java项目|springboot基于spring框架的电影订票系统
计算机java项目|springboot基于spring框架的电影订票系统