对Spring 学习上的一些问题总结:
一、什么是Spring框架?Spring框架的核心有哪些模块组成?
Spring框架是基于Java开发出来的一套轻量级框架,帮助开发者管理对象及其依赖关系,还提供通用日志记录、性能统计、安全控制、异常处理等能力。包含有(1)IoC模块; (2)AOP模块;(3)消息模块;(4)数据访问/集成模块;(5)Web模块;(6)测试模块。
二、在Spring框架中,什么是控制反转?什么是依赖注入?依赖注入的实现方式有哪些?
控制反转:在Spring中是一种通过XML文件或者注解描述并通过第三方去产生或者获取特定对象的方式。对象的实例不再由调用者来创建,而是由Spring容器来创建。控制权由原来的调用者转移到Spring容器,控制权发生了反转。
依赖注入:从Spring容器角度,该容器负责将被依赖的对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,即Spring的依赖注入。
依赖注入的实现方式:(1)使用构造方法注入;(2)使用属性的setter方法注入;(3)实现接口的方法注入。
三、构造方法注入和设值注入有什么区别?
(1)设值注入支持大部分依赖注入
(2)设值注入不会重写构造方法的值
(3)在使用设值注入时还不能保证某种依赖是否已经被注入
(4)在设置注入如果发生对象之间的互相依赖(循环依赖),在创建某对象会发生ObjectCurrentlyInCreationException异常
四、BeanFactory和ApplicationContext有什么区别?BeanFactory和FactoryBean有什么区别?
BeanFactory理解为含有Bean集合的工厂类。它是Spring IoC的基础容器接口,还能在实例化对象时生成协作类之间的关系,包含对Bean生命周期的控制。
ApplicationContext是建立在BeanFactory之上的一种Spring IoC的高级容器接口,它除了具有BeanFactory的所有功能以外,还具有(1)提供了支持国际化的文本消息(2)统一的资源文件读取方式(3)已在监听器中注册的Bean的事件
BeanFactory常用的实现类是XmlBeanFactory;
ApplicationContext常用的实现类是ClassPathXmlApplicationContext、FileSystemXmlApplicationContext和XmlWebApplicationContext。
FactoryBean是一个工厂Bean,是一个Bean,作用是产生其他Bean实例。仅仅需要提供一个工厂方法,该方法用来返回其他Bean的实例。当用户使用容器时候,可以使用转义字符“&”来得到FactoryBean本身。
五、Spring Bean作用域的区别是什么?
1. singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。
2. prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。
3. request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
4. Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
5.global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。
六、怎么管理Spring Bean的生命周期。
Spring提供了以下4种方式来管理Bean的生命周期事件:
(1)InitializingBean和DisposableBean回调接口
(2)针对特殊行为的其他Aware接口
(3)Bean配置文件中的customInit()方法和customDestroy()方法
(4)@PostConstruct和@PreDestroy注解方式
七、如何在Spring配置文件中注入一个Java集合?
Spring提供了以下4种集合类的配置元素:
(1)<list>标签用来装配可重复的list值
(2)<set>标签用来装配没有重复的set值
(3)<map>标签用来注入键和值,可以为任何类型的键值对
(4)<props>标签支持注入键和值都是字符串类型的键值对
八、什么是AOP?什么是Pointcut?
面向切面编程:(Aspect Oriented Programming, AOP)是对面向对象编程(Object Oriented Programming, OOP)补充,在不改变原有程序的基础上为代码段增加新的功能,对其进行增强处理,设计思想来源于代理设计模式。主要关心两个问题,在什么位置和执行什么功能。
切入点Pointcut:对连接点的特征进行描述,可以使用正则表达式。增强处理和一个切入点表达式相关联,并在与这个切入点匹配的某个连接点上运行。
九、什么是通知Advice?通知的类型有哪些?
通知Advice:即增强处理,切面在某个特定连接点上执行的代码逻辑。
通知的类型:(1)前置通知;(2)后置通知;(3)异常抛出通知;(4)环绕通知;(5)最终通知。
十、什么是事务?事务的特征属性是什么?
事务一般是指要做的或所做的事情,在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)
事务具有4个属性:原子性、一致性、隔离性和持久性。通常称为ACID特性。
1.原子性 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。
2.一致性 事务开始前和结束后,数据库的完整性约束没有被破坏 。
3.持久性 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
4. 隔离性 同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰
十一、Spring事务的传播属性有哪些?
1.PROPAGATION_REQUIRED – 如果存在当前事务则用当前事务;如果不存在当前事务,就新建一个事务。这是最常见的选择。
2.PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行。
3.PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常。
4.PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在事务,把当前事务挂起。开启一个新事务,新事务执行完毕后,唤醒之前挂起的事务,继续执行。如果不存在当前事务,则新建一个事务
5.PROPAGATION_NOT_SUPPORTED – 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6.PROPAGATION_NEVER – 以非事务方式执行,如果当前存在事务,则抛出异常。
7.PROPAGATION_NESTED – 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
十二、数据库事务隔离级别有哪些?
ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。
另外四个与JDBC的隔离级别相对应;
ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。
这种隔离级别会产生脏读,不可重复读和幻像读。
ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取
该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
ISOLATION_REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,
不可重复读外,还避免了幻像读。
解释:1)幻读:事务1读取记录时事务2增加了记录并提交,事务1再次读取时可以看到事务2新增的记录;
2)不可重复读取:事务1读取记录时,事务2更新了记录并提交,事务1再次读取时可以看到事务2修改后的记录;
3)脏读:事务1更新了记录,但没有提交,事务2读取了更新后的行,然后事务T1回滚,现在T2读取无效。
十三、什么是编程式事务管理?什么是声明式事务管理?
编程式事务管理:PlatformTransactionManager、TransactionDefinition 和TransactionStatus 三个核心接口,如果方法需要实施事务管理,我们首先需要在方法开始执行前启动一个事务,调用PlatformTrans-actionManager.getTransaction(...) 方法便可启动一个事务。创建并启动了事务之后,便可以开始编写业务逻辑代码,然后在适当的地方执行事务的提交或者回滚。
声明式事务管理:Spring 的声明式事务管理在底层是建立在 AOP 的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。