简介
Spring框架是个轻量级的java EE框架。所谓轻量级,是指不依赖于容器就能运行。Spring以IOC,AOP为主要思想,能够协同Struts,Hibernate,WebWork,JSF,iBatis等众多框架。
Spring解决的主要问题
- Spring的IOC容器降低了业务对象替换的复杂性,提高了组件之间的解耦。提升了代码的灵活性,可维护性高
- Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。
- Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。
- Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。
注:不要只将Spring看作是一个IoC容器,也不要只将Spring与AOP挂钩,Spring提供的远比这些东西要多得多。Spring不仅仅是一个简化Java EE开发的轻量级框架,它更应该是一个简化任何Java应用的开发框架。
1 Spring的IOC容器
1.1 什么是IoC?
IoC全称为Inversion of Control,中文通常翻译为“控制反转”,它还有一个别名叫做依赖注入(Dependency Injection)。那么,为什么需要IoC?IoC的具体意义是什么?它到底有什么独到之处?让我们带着这些疑问开始我们的IoC之旅吧。
其实IoC很简单!原来是需要什么东西自己去拿,现在是需要什么东西就让别人送过来。下图以两种场景,形象地说明了使用IoC模式前后的差别。
出门之前得先穿件外套吧?以前,你得自己跑到衣柜前面取出衣服这一依赖对象,然后自己穿上再出门。而现在,你只要跟你的“另一半”使个眼色或说一句“Honey,衣服拿来。”她就会心领神会地到衣柜那里为你取出衣服,然后再给你穿上。现在,你就可以出门了。(此时此刻,你心里肯定窃喜,“有人照顾的感觉真好!”)对你来说,到底哪种场景比较惬意,我想已经不言自明了吧?
为什么叫做控制反转?
控制:指的是对象创建(实例化、管理)的权利
反转:控制权交给外部环境了(spring框架、IoC容器)
1.2 IoC解决了什么问题?
IoC解决对象之间的耦合问题:
没有使用IoC前,获取对象需要在当前类中new实例化,使用了IoC后,获取对象直接从容器中拿。
1.3 BeanFactory和ApplicationContext
Spring提供了两种容器类型:BeanFactory和ApplicationContext。
BeanFactory基础类型IoC容器,提供完整的IoC服务支持。如果没有特殊指定,默认采用延迟初始化策略(lazy-load)。只有当客户端对象需要访问容器中的某个受管对象的时候,才对该受管对象进行初始化以及依赖注入操作。所以,相对来说,容器启动初期速度较快,所需要的资源有限。对于资源有限,并且功能要求不是很严格的场景,BeanFactory是比较合适的IoC容器选择。
ApplicationContext在BeanFactory的基础上构建,是相对比较高级的容器实现,除了拥有BeanFactory的所有支持,ApplicationContext还提供了其他高级特性,比如事件发布、国际化信息支持等,这会在后面详述。ApplicationContext所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。所以,相对于BeanFactory来说,ApplicationContext要求更多的系统资源,同时,因为在启动时就完成所有初始化,容器启动时间较之BeanFactory也会长一些。在那些系统资源充足,并且要求更多功能的场景中,ApplicationContext类型的容器是比较合适的选择。
下图我们可以对BeanFactory和ApplicationContext之间的关系有一个更清晰的认识。
1.4 IoC和DI的区别
DI:Dependancy Injection(依赖注⼊)
IOC和DI描述的是同⼀件事情,只不过⻆度不⼀样罢了
ioc为目的,控制反转;di是手段,依赖注入,表达比ioc更为直接。ioc将类的对象的创建交给Spring类管理创建,di是ioc的另一种表达方式,它将类里面的属性在创建类的过程中给属性赋值。
依赖注入(DI)是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;
而控制反转(IOC)是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。
2 Spring的AOP框架
2.1 什么是AOP?
AOP: Aspect oriented Programming ⾯向切⾯编程/⾯向⽅⾯编程
AOP是OOP的延续,从OOP说起,OOP三⼤特征:封装、继承和多态,OOP编程思想可以解决⼤多数的代码重复问题,但是有⼀些情况是处理不了的。在顶级⽗类中的多个⽅法中打印日志等相同位置出现了重复代码,OOP就解决不了。
我们先来看⼀下下⾯这两张图:
上图描述的就是未采⽤AOP思想设计的程序,当我们红⾊框中圈定的⽅法时,会带来⼤量的重复劳动。程序中充斥着⼤量的重复代码,使我们程序的独⽴性很差。⽽下图中是采⽤了AOP思想设计的程序,它把红框部分的代码抽取出来的同时,运⽤动态代理技术,在运⾏期对需要使⽤的业务逻辑⽅法进⾏增强。
2.2 AOP在解决什么问题?
在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复
2.3 AOP相关概念
- Aspect(切面):它指定是增强的代码所关注的⽅⾯,把这些相关的增强代码定义到⼀个类中,这个类就是切⾯类。例如,事务切⾯,它⾥⾯定义的⽅法就是和事务相关的,像开启事务,提交事务,回滚事务等等,不会定义其他与事务⽆关的⽅法。。
- Jointpoint(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它joint point。
- Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
- Advice(增强):它指的是切⾯类中⽤于提供增强功能的⽅法。并且不同的⽅法增强的时机是不⼀样的。⽐如,开启事务肯定要在业务⽅法执⾏之前执⾏;提交事务要在业务⽅法正常执⾏之后执⾏,⽽回滚事务要在业务⽅法执⾏产⽣异常之后执⾏等等。那么这些就是通知的类型。其分类有:前置通知 后置通知 异常通知 最终通知 环绕通知。
- Target(目标对象):织入 Advice 的目标对象。它指的是代理的⽬标对象。即被代理对象。
- Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程。它指的是把增强应⽤到⽬标对象来创建新的代理对象的过程。spring采⽤动态代理织⼊,⽽AspectJ采⽤编译期织⼊和类装载期织⼊。
连接点:⽅法开始时、结束时、正常运⾏完毕时、⽅法异常时等这些特殊的时机点,我们称之为连接点,项⽬中每个⽅法都有连接点,连接点是⼀种候选点
切⼊点:指定AOP思想想要影响的具体⽅法是哪些,描述感兴趣的⽅法
Advice增强:
第⼀个层次:指的是横切逻辑
第⼆个层次:⽅位点(在某⼀些连接点上加⼊横切逻辑,那么这些连接点就叫做⽅位点,描述的是具体
的特殊时机)
Aspect切⾯:切⾯概念是对上述概念的⼀个综合
Aspect切⾯= 切⼊点+增强
= 切⼊点(锁定⽅法) + ⽅位点(锁定⽅法中的特殊时机)+ 横切逻辑
众多的概念,⽬的就是为了锁定要在哪个地⽅插⼊什么横切逻辑代码
2.4 Spring中AOP的代理选择
Spring 实现AOP思想使⽤的是动态代理技术。
默认情况下,Spring会根据被代理对象是否实现接⼝来选择使⽤JDK还是CGLIB。
当被代理对象没有实现任何接⼝时,Spring会选择CGLIB。
当被代理对象实现了接⼝,Spring会选择JDK官⽅的代理技术,不过我们可以通过配置的⽅式,让Spring强制使⽤CGLIB。
2.5 AOP声明式事务的⽀持
事务控制分为编程式事务和声明式事务。
编程式事务就是自己写baiTry catch语句调du用commit\rollback等函数来实现那段业务数据改变的事务性。
声明式事务是通过框dao架和事务定义配置给自己的业务代码添加事务性,比如Spring里面的AOP。
前者需要自己写大量重复的事务控制代码,后者通过设置可以一次性给所有的业务方法添加上事务特性。
事务的四⼤特性
原⼦性(Atomicity) 原⼦性是指事务是⼀个不可分割的⼯作单位,事务中的操作要么都发⽣,要么都不发⽣。从操作的⻆度来描述,事务中的各个操作要么都成功要么都失败
⼀致性(Consistency) 事务必须使数据库从⼀个⼀致性状态变换到另外⼀个⼀致性状态。
例如转账前A有1000,B有1000。转账后A+B也得是2000。
⼀致性是从数据的⻆度来说的,(1000,1000) (900,1100),不应该出现(900,1000)
隔离性(Isolation) 事务的隔离性是多个⽤户并发访问数据库时,数据库为每⼀个⽤户开启的事务,每个事务不能被其他事务的操作数据所⼲扰,多个并发事务之间要相互隔离。
⽐如:事务1给员⼯涨⼯资2000,但是事务1尚未被提交,员⼯发起事务2查询⼯资,发现⼯资涨了2000块钱,读到了事务1尚未提交的数据(脏读)
持久性(Durability) 持久性是指⼀个事务⼀旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发⽣故障也不应该对其有任何影响。