1、Spring 是JavaEE 一个开源的框架,他可以应用在任何的Java 程序应用中,使得程序有很好的扩展性,让程序更简捷,降低复杂性。
2、Spring 有两大核心功能,IOC/DI(依赖注入,控制反转) Aop(面向切面编程)
IOC:
(1)IOC 动态注入:让一个对象不需要去new 可以自动生产,
(2)java 程序中的每个业务逻辑至少需要两个或者多个对象去协助完成,每个对象调用的时候都需要new()来完成调用,
你会发现程序的耦合度就高了
(3)而IOC 的思想是Spring 容器来实现这些相互依赖的关系,你只需关系业务的实现就可以了,从这方面来讲对象需要
new()得到协助对象就被反转了,获得依赖的方式就反转了。
(4) IOC的原理是什么?
(4.1) IOC 的操作有两大部分
(1) Ioc 配置文件的方式
(2)注解的方式
(4.2) IOC 底层实现技术
(1)xml 配置文件
(2) dom4j 解析 xml
(3)工厂设计模式
(4)反射机制
(5)注解是怎么实现的
Aop:
(1)多个类的共同行为进行封装,Aop的核心就是切面,它将多个类的通用行为进行了封装,
列如日志模块,根据不同的需求进行封装,根据不同的需求可以在一个程序中可以用若干个切面,、
在Spring Aop 中切面通过注解的类来实现.
(2)怎么创建一个切面
(3)Aop的原理是什么?
aop的实现原理其实就是java的动态代理,但是jdk的动态代理必须实现接口,
所以sping的aop是用cglib这个库实现的,cglib使用了asm这个直接操作字节码的框架,
所以做到不实现接口的情况下完成动态代理;
3、spring 的beanFactory 和 factoryBean有什么区别?
(1) beanFactory是个factory,就是IOC容器或者叫对象工厂,在spring 中所有的bean都是交给beanFactory
(IOC容器)进行管理 ;(管理 bean 的工厂)
(2)factoryBean是个bean,但factoryBean不是一个普通的bean,而是一个能生产对象的工厂bean
他的实现与设计模式工厂模式类似;(factoryBean 用创建 生产 bean 的工厂)
4、spring 框架中的bean 的生命周期?
(1)bean定义
在配置文件里面用<bean></bean>来进行定义。
(2)bean初始化
有两种方式初始化:
A.在配置文件中通过指定init-method属性来完成
B.实现org.springframwork.beans.factory.InitializingBean接口
(3)bean调用有三种方式可以得到bean实例,并进行调用
(4)bean销毁
销毁有两种方式
A.使用配置文件指定的destroy-method属性
B.实现org.springframwork.bean.factory.DisposeableBean接口
5、spring 的事务?
事务的列子:
比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱;然后ATM出1000元钱。
这两个步骤必须是要么都执行要么都不执行。如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元;
如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元,所以,如果一个步骤成功另一个步骤失败对
双方都不是好事,如果不管哪一个步骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,
这对双方都是极好的。
5.1 spring支持的事务管理类型
Spring支持两种类型的事务管理:
(1)编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护
(2) 声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。
注解方式 @Transaction 注解在 需要操作 数据的地方 XxxServiceImpl;
5.2 事务最重要的两个特性,是事务的传播级别和数据隔离级别。。
1. 必须 2.支持 3.强制 4.总是开启新的 5.不支持事务 6.不传播 7.事务嵌套
七种传播特性:
1.PROPAGATION_REQUIRED:(REQUIRED必须的)
如果存在一个事务,则支持当前事务,如果没有则开启。
2. PROPAGATION_SUPPORTS (SUPPORTS 支持)
如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
3. PROPAGATION_MANDATORY (mandatory强制)
如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
4. PROPAGATION_REQUIRES_NEW(需要新的 REQUIRES_NEW)
总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
5. PROPAGATION_NOT_SUPPORTED( NOT_SUPPORTED不支持)
总是非事务地执行,并挂起任何存在的事务
6. ROPAGATION_NEVER(不传播)
总是非事务地执行,如果存在一个活动事务,则抛出异常
7. PROPAGATION_NESTED(NESTED 事务嵌套)
如果一个活动的事务存在,则运行一个嵌套的事务中,如果没有活动事务,则按
TransactionDefinition.PROPAGATION_REQUIRED 属性执行
事务隔离级别:
1.@Transactional(isolation= Isolation.READ_UNCOMMITTED) (脏读)
读取未提交数据(会出现脏读, 不可重复读) 基本不使用
一个事务读取到另一事务未提交的更新数据
2.@Transactional(isolation =Isolation.READ_COMMITTED)(不可重复读)
读取已提交数据(会出现不可重复读和幻读)
在同一事务中, 多次读取同一数据返回的结果有所不同,
3.@Transactional(isolation= Isolation.REPEATABLE_READ) (幻读)
可重复读(会出现幻读)
一个事务读到另一个事务已提交的insert数据
4.@Transactional(isolation= Isolation.SERIALIZABLE) (串行化)