一、spring是一个开源的J2EE框架,而且开发快捷,耦合度相对来说比较低,方便后续的修改,而且一直持续更新,和别的一些orm框架以及其他框架能够很好地结合使用,所以用的比较多。
二、spring框架有什么优缺点:
1、spring是一个轻量级的框架,基础版本很小,只有2M,
2、IOC容器一般就是用的WebApplicationContext,控制反转,我感觉就是控制权反过来,调用者不再去自己创建被调用者的实例对象,而是由spring容器去创建,和IOC一起谈的还有DI,也就是依赖注入,我个人感觉就是容器创建好实例后,在根据依赖关系将对象实例注入到组件当中。一般注入有三种方式,第一种接口注入,第二种是set方法的注入第三种就是构造器注入。
3:AOP编程,spring的AOP编程就是面向切面,spring将影响到多个类的公共行为封装到一个可重用的模块中,比如日志这种贯穿整个项目的。用一句大牛说的就是,aop就是将应用程序的商业逻辑和对其提供支持的通用服务分离。通常aop编程用来日志,权限,缓存,事务中。
global-session每个portlet上下文session对应一个bean。默认生命周期是singleton。
5:MVC框架,spring提供了一个设计优良的web MVC框架.
6:事务管理,spring提供了对下至本地业务上至全局业务提供统一的事务管理接口,spring的事务一般采用采用编程式或者声明式的事务处理,一般编程式的比较灵活,但是需要书写的代码比较多,需要在程序中就要手动指定beginTranscation(),commit(),和rollback()等,而声明式事务是则是在方法前面加上注释或者在配置文件进行配置,a方法需要事务处理,在spring配置文件中就对其前后进行拦截即可。二者相对比而言编程式事务可以由开发人员自己去控制,粒度更细。
7:spring的事务属性和传播级别,spring的Transcation有一个很重要的属性propagation,主要用来配置当前方法是否与transtation有何联系,他的propagation主要有七个取值,
spring事务属性:
第一个是REQUIRED,这个也是spring默认的事务传播的默认属性,他表示如果在有transaction的情况下执行,如果没有,则创建新的transaction
第二个是SUPPORTS,表示如果当前有transaction,在transaction情况下执行,如果没有,那么在没有transaction情况下执行,
第三个是MANDATORY,英文表示强制的,他表示必须在有transaction的情况下执行,如果当前没有transaction,他会直接抛出异常Ille
第四个是REQUIRES_NEW,他表示需要在新的transaction情况下执行,如果以前有,那么将会把它挂起
第五个是NOT_SUPPORTED,表示如果当前没有transaction执行,负责会挂起当前transaction后在执行,
IllegalTransactionStateException异常。
第七个是NESTED,表示如果当前有一个活动的事务,那么他会嵌套在当前事务中,如果没有,那么他的将会属性值设置为REQUIRED
事务传播级别:
PlatfromTransactionManager默认的级别,也是使用数据库默认的隔离级别,其余四个和数据库的隔离级别是相对应的
第二个是ISOLATION_READ_UNCOMMITTED,这个是事务隔离的最低级别,他允许其他事务看到看到这个事务未提交的数据,它对应的数据库的事务隔离级别就是READ_UNCOMMITED,由于是读取其他事务未提交的数据,也被称为脏读,
第三个是ISOLATION_READ_COMMITED,保证一个事务修改的数据提交后才能被其他事务看到,另外一个事务也不能读取该事务为提交的数据,它对应这数据的READ_COMMITED级别,这个是大多数数据库默认的隔离级别,但不是mysql的默认级别,
InnoDB和Falcon存储引擎通过多版本并发机制解决了这个问题,
ISOLATION_SERIALIZABLE ,花费最高代价最可靠的隔离级别,事务被处理为顺序执行,可以避免脏读,不可重复读和幻想读,他对应的数据库的事务隔离级别是Serializable
脏读:某个事务已经更新了数据,这个时候另一个事务也在读取这个数据,由于某种特殊原因,前一个事务rollback了,那么后一个事务读取的数据就是错误的,这就是脏读
不可 重复读:再一个事务两次查询中数据可能不一致,这就是不可重复读,可重复读就是在一个事务两次条相同的sql查询中查询道的结果一样,
幻想读:在一个事务两次查询中结果不一样,比如一个事务查询几列数据,此时另一个事务查无进来数据,那么接下来的查询,就会发现几列数据是先前没有的,这就是幻想读。
8:如何向spring容器提供元数据
1:基于xml配置
2:基于注解,
3:基于java的配置
9:spring框架中的单例beans不是线程安全的。
10:spring中bean的生命周期
1:spring读取xml文件实例化bean
2:spring根据bean的定义设置属性值
3:如果bean实现了BeanNameAware接口,那么Spring将bean的id传递给setBeanName()方法;
4:如果bean实现了BeanFactoryAware接口,那么Spring将beanfactory传递给setBeanFactory()方法;
5:bean的使用
6:bean的销毁
11:如何在spring中插入java的集合类
1:list允许插入相同重复的值
2:set不允许插入重复的值
3:map键值对的方式,这里的键-值可以是任何方式
4:props方式也是键值对的方式,但是这里的键-值方式都是字符串形式
12:spring bean的自动装配
1:no默认的是不进行自动装配,通过手动的ref方式进行手动装备
2:byName方式,通过参数名进行自动装配
3:byType方式,通过参数的数据类型进行自动装配
4:constructor,通过构造函数的参数,
5:autodetecd:如果有构造方法,那么用构造方法进行装配,否则采用byType方式进行装配
13:常用的注解
@controller:控制器的注解,中专控制的servlet
@service:业务层对应的bean
@repository:dao层业务所对应的bean
@requestMapping 对应的url
@RequestParam 绑定的参数
@responseBody 表示返回类型将会被用于HTTP相应字节流输出
.......待续