一、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相应字节流输出

.......待续