1、spring是一个开源的J2EE框架,并且开发快捷,耦合度相对来讲比较低,方便后续的修改,并且一直持续更新,和别的一些orm框架以及其余框架可以很好地结合使用,因此用的比较多。java
2、spring框架有什么优缺点:mysql
一、spring是一个轻量级的框架,基础版本很小,只有2M,
web
二、IOC容器通常就是用的WebApplicationContext,控制反转,我感受就是控制权反过来,调用者再也不去本身建立被调用者的实例对象,而是由spring容器去建立,和IOC一块儿谈的还有DI,也就是依赖注入,我我的感受就是容器建立好实例后,在根据依赖关系将对象实例注入到组件当中。通常注入有三种方式,第一种接口注入,第二种是set方法的注入第三种就是构造器注入。
spring
3:AOP编程,spring的AOP编程就是面向切面,spring将影响到多个类的公共行为封装到一个可重用的模块中,好比日志这种贯穿整个项目的。用一句大牛说的就是,aop就是将应用程序的商业逻辑和对其提供支持的通用服务分离。一般aop编程用来日志,权限,缓存,事务中。
sql
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事务属性:session
第一个是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相应字节流输出
.......待续