1、Spring简述
Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架,Spring致力于提供一种方法管理你的业务对象,Spring的主要
目的是使JavaEE易用和促进好编程习惯,Spring致力于J2EE应用的各层的解决方案,而不是仅仅专一于某一层的方案,Spring贯穿表现
层、业务层及持久层。然而,Spring并不想取代那些已有的框架,而是与它们无缝地整合。
2、Spring体系结构
Spring框架是一个分层架构,它包含一系列的功能要素并被分为大约20个模块。这些模块分为Core Container、Data Access/Integration
Web、AOP(Aspect Oriented Programming)、Instrumentation和测试部分;web
(1)核心容器(Core Container)
1:Core和Beans模块提供了Spring最基础的功能,提供IOC 和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory
模式的经典实现来消除对程序性单例模式的须要,并真正地容许你从程序逻辑中分离出依赖关系和配置。
2:Context模块基于 Core和 Beans来构建,它提供了用一种框架风格的方式来访问对象,有些像JNDI注册表。Context封装包继
承了 beans 包的功能,还增长了国际化(I18N),事件传播,资源装载,以及透明建立上下文,例如经过servlet容器,以及对大量
JavaEE特性的支持,如 EJB、JMX。核心接口是ApplicationContext。
3:Expression Language,表达式语言模块,提供了在运行期间查询和操做对象图的强大能力。支持访问和修改属性值,方法调
用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring容器获取Bean,它也支持列表投影、选
择和通常的列表聚合等。
(2)数据访问/ 集成部分(Data Access/Integration)
1:JDBC模块,提供对JDBC的抽象,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。
2:ORM模块,提供了经常使用的"对象/关系"映射API的集成层。 其中包括JPA、JDO、Hibernate和iBatis 。利用ORM封装包,能够混
合使用全部Spring提供的特性进行"对象/关系"映射,如简单声明性 事务管理 。
3:OXM模块,提供一个支持Object和XML进行映射的抽象层,其中包括JAXB、Castor、XMLBeans、JiBX 和 XStream。
4:JMS模块,提供一套"消息生产者、消费者"模板用于更加简单的使用 JMS,JMS 用于在两个应用程序之间,或分布式系统中发
送消息,进行异步通讯。
5:Transaction模块,支持程序经过简单声明性事务管理,只要是Spring管理对象都能获得Spring管理事务的好处,即便是POJO,
也能够为他们提供事务。
(3)Web
1:Web-Socket模块,WebSocket protocol是HTML5一种新的协议。它实现了浏览器与服务器全双工通讯,spring支持webSocket通讯。
2:Web模块,提供了基础的web功能。例如多文件上传、集成IOC容器、远程过程访问、以及Web Service支持,并提供一个
RestTemplate类来提供方便的Restful services访问
3:Web-Servlet模块,提供了Web应用的Model-View-ControllerMVC)实现。Spring MVC框架提供了基于注解的请求资源注入、更
简单的数据绑定、数据验证等及一套很是易用的JSP标签,彻底无缝与Spring其余技术协做。
4: Web-Portlet模块,提供了在Portlet环境下的MVC实现。
(4)AOP
1:AOP模块,提供了符合AOP联盟规范的面向方面的编程实现,让你能够定义如方法拦截器和切入点,从逻辑上讲,能够减弱代码
的功能耦合,清晰的被分离开。并且利用源码级的元数据功能,还能够将各类行为信息合并到你的代码中 。
2:Aspects模块,提供了对AspectJ的集成。
3:Instrumentation模块, 提供一些类级的工具支持和ClassLoader级的实现,能够在一些特定的应用服务器中使用。
(5)Test
Test模块,提供对使用JUnit和TestNG来测试Spring组件的支持,它提供一致的ApplicationContexts并缓存这些上下文,它还能
提供一些mock对象,使得你能够独立的测试代码。
3、Spring的优势
方便解耦,简化开发
Spring就是一个大工厂,能够将全部对象建立和依赖关系维护,交给Spring管理;
AOP 编程的支持
Spring提供面向切面编程,能够方便的实现对程序进行权限拦截、运行监控等功能
声明式事务的支持
只须要经过配置就能够完成对事务的管理,而无需手动编程
方便程序的测试
Spring对Junit4支持,能够经过注解方便的测试Spring程序方便集成各类优秀框架Spring不排斥各类优秀的开源框架,其内部
提供了对各类优秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支持;
下降JavaEE API的使用难度
Spring对 JavaEE开发中很是难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大下降。
4、ApplicationContext文件与BeanFactory类正则表达式
1. ApplicationContext它是扩展BeanFactory接口;
2. BeanFactory它采起延迟加载的方案,只有真正在getBean时才会实例化Bean在开发中咱们通常使用的是 ApplicationContext,
真正使用的是其实现类,FileSystemXmlAppliCationContext根据文件路径获取,ClassPathXmlApplicationContext 根据类路径获
取;
3. AppliCationContext它会在配置文件加载时,就会初始化Bean而且ApplicationContext它提供不一样的应用层的Context实现。
5、Bean的做用域
在bean声明时它有一个scope(做用域)属性,它是用于描述bean的做用域。
可取值有:
singleton:单例 表明在spring ioc容器中只有一个Bean实例(默认的scope)
prototype 多例 每一次从spring容器中获取时,都会返回一个新的实例
request 用在web开发中,将bean对象request.setAttribute()存储到request域中
session 用在web开发中,将bean对象session.setAttribute()存储到session域中
在开如经常使用的值是singleton与prototype。
6、Bean的生命周期spring
1. instantiate bean 对象实例化;
2. populate properties 封装属性;
3. 若是 Bean 实现 BeanNameAware 执行 setBeanName;
4. 若是 Bean 实现 BeanFactoryAwar 或 ApplicationContextAwar 设置工厂 setBeanFactory 或上;
下文对象 setApplicationContext;
5. 若是存在类实现 BeanPostProcess(后处理 Bean),执行 postProcessBeforeInitialization;
6. 若是 Bean 实现 InitializingBean 执行 afterPropertiesSet;
7. 调用自定义的 init-method 方法;
8. 若是存在类实现 BeanPostProcessor(处理 Bean),执行 postProcessAfterInitialization;
9. 执行业务处理;
10. 若是 Bean 实现 DisposableBean 执行 destroy;
11. 调用自定义的 destroy-method;
7、AOP
1. 简述
AOP(面向切面编程)经过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是(面向对象编程)的延续,
是软件是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP能够对业务逻辑的各个部分进行隔离,从而使
得业务逻辑各部分之间的耦合度下降,提升程序的可重用性,同时提升了开发的效率。
AOP是一个概念,并无设定具体语言的实现,它能克服那些只有单继承特性语言的缺点,spring2.0以后整合AspectJ第三
方AOP技术。AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法因此它有一个专门的编译器用来生成遵
守Java字节编码规范的Class文件。
1.1 主要功能
日志记录,性能统计,安全控制,事务处理,异常处理等等
1.2 主要意图
将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,经过对这些行为的分离,我
们但愿能够将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
2. AOP与OOP区别
OOP针对业务处理过程的实体及其属性和行为进行抽象封装,以得到更加清晰高效的逻辑单元划分。而AOP则是针对业务处理过
程中的切面进行提取,它所面对的是处理过程当中的某个步骤或阶段,以得到逻辑过程当中各部分之间低耦合性的隔离效果。这两种
设计思想在目标上有着本质的差别。
3. 相关术语
3.1 目标对象(target)
指的是须要被加强的对象,因为aop是经过代理模式实现,从而这个对象永远是被代理对象。
3.2 链接点(join point)
所谓链接点是指那些被拦截到的点,在spring中这些点指的是方法,spring只支持方法类型的链接点。
3.3 切入点(pointcut)
表示一组joint point,这些joint point或是经过逻辑关系组合起来,或是经过通配、正则表达式等方式集中起来,它定
义了相应的Advice将要发生的地方简单说切入点是指咱们要对哪些链接点进行拦截的定义。
3.4 通知(advice)
所谓通知是指拦截到链接点以后所要作的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知
Advice定义了在pointcut里面定义的程序点具体要作的操做。
3.5 引介(introduction)
引介是一种特殊的通知,在不修改类代码的前提下,introduction能够在运行期为类动态地添加一些方法或属性。
3.6 切面(aspect)
是切入点和通知的结合。
3.7 织入(weaving)
织入是一个过程,是将切面应用到目标对象从而建立出AOP代理对象的过程,织入能够在编译期,类装载期,运行期进行。
Spring采用动态织入,而aspectj采用静态织入。
3.8 代理(Proxy)
一个类被AOP织入加强后,就产生一个结果代理类。
4.AOP的动态代理
AOP的底层实现就是动态代理,通常AOP分为静态AOP和动态AOP。静态AOP是指AspectJ实现的AOP,他是将切面代码直接编译到
Java类文件中。动态 AOP是指将切面代码进行动态织入实现的AOP。Spring的AOP为动态AOP,实现的技术为:JDK提供的动态代理
技术和CGLIB(动态字节码加强技术)。
4.1 JDK动态代理
在JVM运行时,内部动态生成class字节码对象(即Class 对象),注:JDK动态代理只针对于接口操做。
4.2 CGLIB动态代理
CGLIB是一个开源项目是一个高性能,高质量的Code生成类库,它能够在运行期扩展Java类与实现Java接口。CGLIB包的底
层是经过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类,单独使用CGLIB,那么须要导入CGLIB的jar包还
须要一个asm相关jar包,可是spring框架的spring-core.jar 包中已经集成了CGLIB与asm。
注意:JDK动态代理只能够为接口去完成操做,而CGLIB动态代理能够为没有实现接口的类去作代理,也能够为实现接口的类
去作代理。CGLIB动态代理它能够为没有实现接口的类作代理,也能够为接口类作代理。
若是目标对象,有接口,优先使用:JDK动态代理只,若是目标对象,无接口,使用CGLIB动态代理。
5.AOP的传统编程
在传统的Spring AOP开发中它支持加强(advice)有五种:
1. 前置通知 目标方法执行前加强org.springframework.aop.MethodBeforeAdvice;
2. 后置通知 目标方法执行后加强org.springframework.aop.AfterReturningAdvice;
3. 环绕通知 目标方法执行先后进行加强org.aopalliance.intercept.MethodInterceptor;
4. 异常抛出通知 目标方法抛出异常后的加强org.springframework.aop.ThrowsAdvice;
5. 引介通知 在目标类中添加一些新的方法或属性org.springframework.aop.IntroductionInterceptor;
6.Spring 整合aspectj框架实现AOP
Aspect:切面 =切点+通知(多个切点与多个通知的组合)
AspectJ它是一个第三方框架,spring 从 2.0 后可使用 aspectJ 框架的部分语法。
AspectJ框架它定义的通知类型有六种:
1. 前置通知 Before至关于BeforeAdvice;
2. 后置通知 AfterReturning至关于AfterReturningAdvice;
3. 环绕通知 Around至关于MethodInterceptor;
4. 抛出通知 AfterThrowing至关于ThrowAdvice;
5. 引介通知 DeclareParents至关于IntroductionInterceptor;
6. 最终通知 After不论是否异常,该通知都会执行,相比Spring的传统AOP Advice多了一个最终通知。
8、Spring的事务管理
Spring的事务管理的四个优势:
1. 提供一致的对于不一样的事务管理的 API;
2. 支持声明式事务管理;
3. 编程事务管理;
4. 优秀的整合与Spring的数据访问:
Spring的事务管理主要提供了三个接口来完成:
1. org.springframework.transaction.PlatformTransactionManager
这是一个事务管理器,能够来选择相关的平台(jdbc hibernate jpa…)
2. TransactionDefinition
它定义事务的一些相关信息 例如:隔离、传播、超时、只读
3. TransactionStatus
(1)PlatformTransactionManager
平台事务管理器,在不一样的持久化层解决技术它的事务代码不同。
JDBC 开发
sql
Connection con=……; con.setAutoCommit(false);//开启事务 con.rollback(); con.commit();
Hibernate 开发
数据库
Session session=….; Transaction t=session.beginTransaction(); t.commit(); t.rollback();
PlatformTransactionManager 接口API
DataSourceTransactionManager 主要针对于JdbcTemplate开发MyBatis开发;
HibernateTransactionManasger 主要针对于Hibernate开发;
JpaTransactionManager 主要针对于JPA开发。
(2)TransactionDefinition
它描述的是事务的定义信息,在TransactionDefinition中定义了大量的常量。
8.1 隔离
事务的四个特性:ACID原子性、一致性、隔离性、持久性。
脏读,不可重复读 虚读。
ISOLATION_DEFUALT 它使用后端数据库的默认隔离级别(spring 中选项)
ISOLATION_READ_UNCOMMITTED 不能解决问题,会发生脏读 不可重复读 虚读
ISOLATION_READ_COMMITTED 能够解决脏读 会产生不可重复读与虚读。
ISOLATION_REPEATABLE_READ 能够解决脏读,不可重复读 解决不了虚读
ISOLATION_SERIALIZABLE 串行化,能够解决全部问题
对于不现的数据库,它的底层默认事务隔离级别不同。
Oracle 数据库它默认的是 read_committed
Mysql 数据库它默认的是 repeatable_read.
8.2 超时
默认值是-1它使用的是数据库默认的超时时间。
8.3 只读
它的值有两个true/false,若是选择true通常是在select操做时
8.4 传播
解决的是两个被事务管理的方法互相调用问题。它与数据库不要紧,是程序内部维护的问题。其中:
PROPAGATION_REQUIRED 默认值 两个操做处于同一个事务,若是以前没有事务,新建一个事务;
PROPAGATION_REQUIRES_NEW两个操做处于不一样的事务;
PROPAGATION_NESTED是一种嵌套事务,它是使用 SavePoint 来实现的。事务回滚时能够回滚到指定的savepoint,
注意:它只对DataSourceTransactionManager有做用;
PROPAGATION_SUPPORTS 支持当前事务,若是不存在,就不使用事务;
PROPAGATION_MANDATORY 支持当前事务,若是不存在,抛出异常;
PROPAGATION_NOT_SUPPORTED 以非事务运行,若是有事务存在,挂起当前事务;
PROPAGATION_NEVER 以非事务运行,若是有事务存在,抛出异常;
8.5 TransactionStatus
定义了事务状态信息,在事务运行过程当中,获得某个时间点的状态。
8.6 声明式事务管理
(1)事务管理方式
1. 编码方案 不建议使用,它具备侵入性。在原有的业务代码基础上去添加事务管理代码。
2. 声明式事务控制,基于 AOP 对目标进行代理,添加 around 环绕通知。
这种方案,它不具备侵入性,不须要修改原来的业务代码
(2)基于xml配置声明式事务管理方案
第一步:在applicationContext.xml文件中添加aop与tx的名称空间
第二步:在applicationContext.xml件中配置
Spring提供的advice是传统的 spring advice
1. 声明事务管理器
2. 配置通知
Spring为咱们提供了一个ransactionInterceptor来完成加强对于这个加强,咱们可使用spring为咱们提供的一个标签
<tx:advice>来完成操做
3. 配置切面
由于使用的是传统的Spring的Advice,须要使用<aop:advisor>。
(3)基于Annotation声明式事务管理方案
可使用@Transaction来在类或方法上添加声明式事务管理。
注意:须要在 applicationContext.xml 文件中使用至关于开启注解事务控制。编程