一、spring是一个开源的J2EE框架,而且开发快捷,耦合度相对来说比较低,方便后续的修改,而且一直持续更新,和别的一些orm框架以及其他框架能够很好地结合使用,所以用的比较多。
二、spring框架有什么优缺点:
1、spring是一个轻量级的框架,基础版本很小,只有2M,
2、IOC容器一般就是用的WebApplicationContext,控制反转,我感觉就是控制权反过来,调用者不再去自己创建被调用者的实例对象,而是由spring容器去创建,和IOC一起谈的还有DI,也就是依赖注入,我个人感觉就是容器创建好实例后,在根据依赖关系将对象实例注入到组件当中。一般注入有三种方式,第一种接口注入,第二种是set方法的注入第三种就是构造器注入。
3:AOP编程,spring的AOP编程就是面向切面,spring将影响到多个类的公共行为封装到一个可重用的模块中,比如日志这种贯穿整个项目的。用一句大牛说的就是,aop就是将应用程序的商业逻辑和对其提供支持的通用服务分离。通常aop编程用来日志,权限,缓存,事务中。
4:容器:spring容器可以帮助管理开发使用中的bean,专业术语叫做IOC控制反转,传统开发中对象的生成全部是由开发者完成,在IOC控制反转中,对象的创建生命周期全部由容器去完成。好久就是减少了依赖性。Bean在容器中的生命周期一般创建,然后填入属性,事件通知,使用,销毁。此外bean的作用域,也就是bean的寿命,只需要设置bean的scope属性就行,四个作用域分别是singleton,prototype,request,session,global-session,其中singleton是spring默认的,整个应用之中只有一个,prototype就是每次每次调用都生成一个新的,bean这个也是简单解决多线程问题,request就是在每次HTTP请求的时候生成一个bean,session就是每个session会话有一个bean,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后在执行,
第六个是NEVER,表示必须在没有transation的情况下执行,如果有transaction,则会抛出IllegalTransactionStateException异常。
第七个是NESTED,表示如果当前有一个活动的事务,那么他会嵌套在当前事务中,如果没有,那么他的将会属性值设置为REQUIRED
事务传播级别:
第一个是ISOLATION_DEFAULT,这个是PlatfromTransactionManager默认的级别,也是使用数据库默认的隔离级别,其余四个和数据库的隔离级别是相对应的
第二个是ISOLATION_READ_UNCOMMITTED,这个是事务隔离的最低级别,他允许其他事务看到看到这个事务未提交的数据,它对应的数据库的事务隔离级别就是READ_UNCOMMITED,由于是读取其他事务未提交的数据,也被称为脏读,
第三个是ISOLATION_READ_COMMITED,保证一个事务修改的数据提交后才能被其他事务看到,另外一个事务也不能读取该事务为提交的数据,它对应这数据的READ_COMMITED级别,这个是大多数数据库默认的隔离级别,但不是mysql的默认级别,
第四个是ISOLATION_REPEATABLE_READ,这种级别的事务隔离,可以防止脏读,不可重复读,但是不能阻挡幻想读,它对应着数据库的隔离级别是REPEATABLE_ABLE,这个是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相应字节流输出
.......待续