了解Spring
为了高效地使用Spring,先了解Spring的一些特性:
1、Spring是一个非侵入(non-invasive)框架。Spring框架可以使应用程序代码对框架的依赖最小化。在Spring中配置JavaBean时甚至不需要引用Spring API,而且还可以对很多旧系统中未使用Spring的Java类进行配置。
2、Spring提供了一种一致的,在任何环境下都可以使用的编程模型。Spring应用程序不尽可以运行在Java和Web容器中,也可以运行在其他环境中,如桌面程序。在Spring中提供了一种编程模型来隔离应用程序代码和运行环境,以使代码对它的有一些环境的依赖达到最小化。
3、提高代码的重用性。Spring可以尽量避免在程序中硬编码。它可以将应用程序中的某些代码抽象出来(一般是在XML中配置),以便使这些代码可以在其他程序使用。
4、Spring可以使系统架构更容易选择。Spring的目标之一就是使应用的每一层都可以更容易更换。如在中间层可以在不同的O/R映射看见之间切换,而这种切换过程对商业逻辑的影响是非常小的。或是切换不同的MVC看见(Strats、Spring MVC),这样做并不影响系统的中间层。
5、Spring并不重造轮子。尽管Spring所涉及的范围非常广,但是大多数应用并没有自己实现,如O/R映射,就是使用很多流行的框架,如Hibernate。还有像连接池、分布式事务、远程协议或其他的系统服务,Spring也是使用了已经存在的解决方案,而不是选择自己去造。
Spring的核心技术:1、反向控制,2、面向方面编程,3、一致性抽象,4、异常处理,5、资源管理。
1、反向控制(Inversion of Control,IoC),也叫依赖注入
的那个一个对象需要另外一个对象时,在传统的设计过程中,往往需要通过调用者创建被调用者的对象实例。但在Spring中,创建被调用者的工作不再由调用者来完成,而由Spring提供的ApplicationContext对象去完成创建,对象使用完后关闭ApplicationContext对象即可,被调用者预先在配置文件中设定好即可,也就是说调用者被剥夺了创建被调用者的权利。因此,这种模式被称为反向控制。在反向控制模式下,与一般被调用者的创建是由Spring IoC容器来完成的,因此也称为依赖注入。
2、面向方面编程(AOP)
AOP现在是比较热门的编程方式,但它并不是取代OOP,而是作为OOP的扩展和补充。在OOP中,类和接口的关系是一个层次(或是树结构),子类会自动继承父类的所有特性。这种继承关系虽然是代码重用达到一定的高度,但在某些情况下,代码仍然会出现冗余。如果想在同一层的兄弟节点(或是一些指定的节点)都插入一段写日志的代码。在这种情况下,如果采用OOP思想,最简单的做法是将写日志的功能封装在一个类中,然后在要写日志的类中调用。但这样做有一个问题,如果要将写日志的功能关闭,或是传递不同的参数,就需要修改很多个不同调用点,而且很容易出现错误,而使用AOP,这个问题就很容易解决。
AOP采用的是一种“横向切割”的方式(OOP实际上是纵向继承)进行编程。所谓横向切割,就是将类层次树横向切一刀,并且会自动在这一刀所波及到的类(节点)中插入相同的代码。也就是说,横向切割的作用就是找到符合某一规则的类(如以Test开头的类),并在这些类中插入统一的代码。浙西而被插入的代码并不在类中,而是写在了方面(Aspect) 中,Aspect在AOP中的地位相当于Class在OOP中的地位。这样在修改这些代码时,只需要修改Aspect中的代码,所有被插入的代码就会自动更改。在Spring中提供了自己的AOP框架,叫做Spring AOP,当然Spring也可以使用其他的AOP框架,如AspectJ和JBoss AOP。
为什么要使用反向控制(IoC)
对象工厂模式按照传统方式建立对象时,一般是在对象工厂的方法里通过new关键字来建立相应的对象实例。然而这种方式建立的对象和对象工厂耦合度过高。为了降低耦合度,使用反向控制模式是最直接的方法。反向控制模式的核心思想就是使建立对象的过程在对象工厂外部进行,而对象工厂通过多态的方式来建立相应的对象(实际上是返回一个实现某个接口的对象)。
任何有应用价值的系统都至少有两个类来相互配合工作。通过由一个主要的入口类来启动程序,然后在这个来中创建另一个类的对象实例,并进行相应的操作。这种工作方式是由调用者主动创建对象实例,是主动的构造模式。
而如果使用IoC ,创建对象的任务并不是有调用者来完成的,是通过外部的协调者(在Spring中是Spring IoC容器)里完成的。因此也可以认为调用者要依赖Spring IoC容器来获得(或称为注入)对象实例,所以也可以将IoC称为依赖注入。