Spring是一个轻量级开源框架.说到Spring的特性就不得不说IOC和AOP,那咱们就分别说明一下.
(一)IoC(Inversion of Control):控制反转
众所周知,在学习Java基础的时候会讲到对象间的关系可以归为四种分别为:依赖、关联、聚合和组合.这里的依赖关系指的其实是类和类之间的关系.
举个栗子:就像是人要吃饭喝水,但是人体本身是不生产食物和水源的,这就叫做人依赖于食物和水源.
百度百科有一种说法是"可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 的‘反射‘编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性"。
可见其实IoC的底层实现是"反射",反射是啥?其实就像是克隆人,给一个DNA,他给你造出来一个人。大概就这意思吧!
可是为啥要使用XML配置文件呢?在实际开发中项目上线的时候往往不可能像咱们编程时候一样停止服务器修改代码再编译后运行,客户的机器上是没有装什么JDK、Tomcat的。XML的最大优点是修改后是不需要编译,设置可以实现“热插拔”,这样就大大降低了我们在实战中修改代码的难度。
关于依赖注入还可以参考 http://blog.csdn.net/u011637069/article/details/51958918 ,他写的还是蛮全的。
(二)AOP(Aspect Oriented Programming):面向切面编程
一提到Java大家最先想到的是“对象”,是的Java入门的时候学的就是“OOP(面向对象编程)”,而AOP实际上是OOP的升级版。
为什么这么说呢?因为AOP是根据业务逻辑在OOP的基础上将部分业务根据切面进行抽取和封装,以便获取逻辑清晰、简洁的代码,并且实现了松耦合的目的。这里最具代表性的我觉得就是“日志记录”了。
举个栗子:公司OA系统,A员工想要修改B表格,之后C员工发现表格资料有问题,怎么知道谁修改了表格呢?只要查看日志文件就好了啊!
所以程序员在开发OA的时候在修改文件的方法上可以调用记录日志功能,可是很多地方都有需要这个功能,怎么办呢?此时我们就可以引入AOP的思想,将记录日志的功能提取出来与对象隔离开来封装成“log切面”,可是与对象隔离开了怎么调用呢?这就要引入“代理模式”啦!代理模式其实就是对目标类在功能上的扩充。也就是在执行到目标方法的时候代理对象说“等一下”我加点儿东西,把log切面加进去了,日志就记录上了“谁什么时间干了什么事儿!”,然后程序继续运行。
可见AOP的底层实现是“动态代理”。代理模式分为:静态代理和动态代理,而动态代理又有JDK动态代理和CGLib代理等等。具体的在此暂不多说,之后有时间另开一章说说。
其实Spring除了IOC和AOP还有一个非常重要的特点就是“容器”的概念。
(三)容器(Beans)
容器的存在目的应该是跟JavaBean一起使用,是滴,容器可以给JavaBean初始化赋值(这里的话也要用到IoC的DI)。
org.springframework.beans 包中有一个类叫做“BeanFactory”,顾名思义它是一个Bean工厂(静态工厂模式),可以生产出来Bean对象。这些个Bean产品默认是“单例”的(scope = singlton,容器加载的时候就被实例化了,这个工厂的产品可是限量版的),也可以设置为多例的(scope = prototype,延迟实例化)。
下图为Spring按照功能划分的示例图:
Data Access/Integration:数据集成,提供了如JDBC、ORM、事物管理等功能的支持。
Web:可以理解为Spring MVC,提供了如套接字、servlet、文件上传等功能的支持。
Messaging:是spring4新增加的功能,提供了message应用的实现。
Core Container:Spring核心功能,其中core和bean是整个框架的核心,core提供了基础的DI和IoC功能,bean实现了容器的支持。 Context建立在core和beans模块之上,beans模块继承它的功能同时增加了国际化支持,并且支持EJB等。SpEL是Spring EL表达式,暂时还没用过。
Test:就是测试用的,例如:Junit。