谈谈你对Spring的理解?
- 一个轻量级的开源框架;
- 6个模块的集成:核心容器、数据访问与集成、AOP、Web、消息、测试六个模块的集成
- 用的最多的还是IoC和AOP两个特性:
IoC指的是控制反转,把对象的创建和依赖关系的维护交给Spring容器去管理。
AoP一般称为面向切面编程,是面向对象的一种补充。
Spring的特点是什么/Spring的优点是什么?
- 轻量方便解耦简化开发、
- 控制反转(把对象的创建和依赖关系的维护交给Spring容器去管理)、
- 支持面向切面的编 程(AOP)、
- 支持事务管理,声明式事务的支持
- 内部提供了对各种优秀框架的直接支持,方便集成各种优秀框架。
Spring由哪些模块组成?
Spring 总共有 20 个模块, 由 1300 多个不同的文件构成。
这些组件被分别整合在核心容器 、 AOP和设备支持 、数据访问与集成 、 Web、 消息 、 测试 6 个模块中。
Spring上下文面试题
-
ApplicationContext 通常的实现是什么?
AnnotationConfigApplicationContext,注解
ClassPathXmlApplicationContext, xml配置文件,需要正确设置 classpath 。因为这个容器将在 classpath 里面找 bean 的配置
FileSystemXmlApplicationContext, xml配置文件,XML Bean配置文件的全路径名必须提供给它的构造函数 -
BeanFactory和 Application contexts 有什么区别?
BeanFactory是Spring里面最低层的接口,只提供了实例化对象和拿对象的功能。
ApplicationContext,继承BeanFactory接口,包含BeanFactory的所有功能以及AOP,国际化等更多功能
Spring IoC面试题
-
什么是Spring IoC 容器,有什么作用?
所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。
Spring IOC 负责创建对象,管理对象,装配对象,配置对象,并且管理这些对象的整个生命周期。 -
控制反转(IoC)优点是什么,实现机制,支持哪些功能?
- 优点:使开发更高效,开发者不用再自己取管理Bean
- Spring 中的 IoC 的实现原理就是工厂模式加反射机制。
- 支持功能:依赖注入,自动装配Bean,回调,初始化,AOP
什么是Spring的依赖注入(DI),优势,DI的基本原则,有哪些不同类型的依赖注入方式,推荐使用哪种?
Spring Bean的面试题
-
什么是 Spring Beans
是一个由Spring IoC容器实例化、组装和管理的对象 -
一个 Spring Bean 定义(Bean Definition)包含什么 ?
一个全路径类名,Bean 的行为配置元素,对其他 Bean 的引用,其他配置的设置. -
如何给 Spring 容器提供配置元数据?
基于注解,基于XML,基于Java配置(@Import ) -
Spring 支持的几种bean的作用域?
singleton作用域 : 是spring默认的作用域,bean 在每个 Spring ioc 容器中只有一个实例。
prototype作用域:一个 bean 的定义可以有多个实例,但该作用域谨慎使用,频繁创建和销毁会严重影响性能。
request作用域:每次 http 请求都会创建一个 bean, 该作用域仅在基于 web 的 Spring Application Context 情况下有效。
session作用域:在一个 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的 Spring Application Context 情况下有效 。
global-session作用域:在一个全局的 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的 Spring Application Context 情况下有效。 -
解释 Spring 框架中 bean 的生命周期?
推断构造方法,实例化Bean,依赖注入,Aware 回调,初始化前,初始化,初始化后(AOP,事务)
Spring Bean 创建过程简述 -
哪些是重要的 bean 生命周期方法?你能重载它们吗?
setup,它是在容器加载bean的时候被调用。
teardown它是在容器卸载类的时候被调用
Bean 标签有两个重要的属性(init-method和destroy-method),这两个属性用于指定初始化和销毁方法。它们也有相应的注解(@PostConstruct和@PreDestroy )。 -
什么是 bean 的自动装载?解释不同方式的自动装配?
- 通过依赖注入把有依赖关系的bean组装再一起;
- 自动装配的类型:
no方式:是默认的方式,不进行自动装配,通过显式设置 ref 属性来进行装配。
byName方式:是通过参数名自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname之后,容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。
byType方式: 是通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byType之后,容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多个 bean 符合条件,则抛出错误。
constructor方式:这个方式类似于 byType方式,但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
autodetect方式:首先尝试使用 constructor 方式来自动装配,如果无法工作,则使用 byType 方式。
你可以在Spring中注入一个null 和一个空字符串吗?
Spring 注解面试题
-
@Autowired和@Resource之间的区别
@Autowired注解:默认是按照类型来装配注入的,它要求依赖对象必须存在。
@Resource注解:默认是按照名称来装配注入的,只有找不到与名称匹配的bean才会按照类型来装配注入。
Spring事务面试题
-
Spring事务的实现方式和实现原理
Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务管理功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。 -
事务的ACID是指什么?
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败,通过日志和同步备份可以在故障发生后重建数据。 -
Spring事务的五种事务隔离级别?
DEFAULT:是Spring事务默认的隔离级别,使用数据库默认的事务隔离机制
未提交读(read uncommited):是最低的事务隔离级别,它允许另外一个事务可以读取当前事务未提交的数据。脏读,不可重复读,幻读都有可能发生
已提交读(read commited): 保证一个事务提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。避免了脏读,但是不可重复读和幻读都有可能发生
可重复读(repeatable read):保证一个事务不会修改已经由另一个事务读取但未提交或者未回滚的数据,避免了脏读和不可重复读,但是幻读有可能发生
可串行化(serializable):最严格的事务隔离级别,支持事务串行执行,资源消耗最大,避免了脏读,不可重复读,幻读- 什么是脏读、不可重复读、幻读?
脏读 :表示一个事务能够读取另一个事务中还未提交的数据。比如A事务执行过程中,B事务读取了A事务的修改。但是由于某些原因A事务没有完成提交,发生了回滚操作,则B事务所读取的数据是不正确的,这就是脏读。
不可重复读 :表示一个事务读到另一个事务已经提交的updated数据,导致多次查询结果不一致。比如B事务读取了两次数据,在这两次的读取过程中A事务修改了数据,导致B事务的这两次读取出来的数据不一样,这就是不可重复读
幻读 :表示一个事务读到另一个事务已经提交的insert数据,导致多次查询结果不一致。比如B事务读取了两次数据,在这两次的读取过程中A事务添加了数据,导致B事务的这两次读取出来的数据不一样,这就是幻读
- 什么是脏读、不可重复读、幻读?
-
Spring事务的7种传播级别?
-
你更倾向使用哪种事务管理类型?
对于声明式事务管理和编程式事务管理,我更喜欢选择声明式事务管理,因为它对应用代码的影响最小,更符合一个无侵入的轻量级容器的思想。
AOP面试题
-
解释 AOP?
为面向切面编程作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可复用的模块.
这个模块被命名为“切面”,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性,可用于权限认证、日志、事务处理等方面。 -
Spring AOP and AspectJ AOP 有什么区别?AOP 有哪些实现方式?
spectJ是静态代理的增强,Spring AOP使用的是动态代理。 -
解释一下Spring AOP里面的几个名词?
Spring AOP -
Spring通知有哪些类型?
前置通知:在一个方法执行之前调用的通知。
后通知: 在方法执行之后调用的通知,无论方法执行是否成功。
返回后通知: 仅当方法成功完成后调用的通知。
抛出异常后通知: 在方法抛出异常退出时调用的通知。
环绕通知: 在方法执行之前和之后调用的通知 。 -
在 Spring AOP 中,关注点和横切关注点的区别是什么?
Spring AOP -
什么是(Aspect)切面?
Spring AOP -
有几种不同类型的自动代理?
BeanNameAutoProxyCreator ,DefaultAdvisorAutoProxyCreator , Metadataautoproxying
Spring 框架中都用到了哪些设计模式?
- 工厂模式:BeanFactory是工厂模式的一个实现,用来创建对象的实例;
- 单例模式:Spring配置文件定义的Bean默认为单例模式。
- 代理模式:Spring的AOP功能的实现用到了代理模式;
- 模板方法模式:用来解决代码重复的问题。比如. RestTemplate模版类, JmsTemplate模版类,JpaTemplate模版类。
- 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
Spring如何处理线程并发问题?
一般情况下,只有无状态的Bean才可以在多线程的环境下共享。
因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。