1.1 使用Spring简化Java开发
为了降低Java开发,Spring使用了一下4种关键策略:
- 基于POJO的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和管理进行声明式编程;
- 通过切面和模版减少样板式代码;
1.1.1 激发POJO的潜能
Spring竭力避免因自身的API而弄乱你的代码。不会强迫你去实现Spring规范的接口或继承Spring规范的类,相反,它的类通常没有任何痕迹表名你使用了Spring。最坏的场景是,一个类或许会使用Spring的注解,但它仍然是POJO。
1.1.2 依赖注入(DI)
任何一个有实际意义的应用都会由两个或者更多的类组合,这些类相互之间进行协作来完成特定的业务逻辑。按照传统做法,每个对象负责管理与自己互相协作的对象的引用,这将会导致高度耦合和难以测试的代码。
耦合具有两面性。一方面,紧密耦合的代码难以测试、难以复用、难以理解,并且典型地出现打地鼠式的bug特性。另一方面,一定程度的耦合又是必须的,完全没有耦合的代码什么也做不了。总而言之,耦合是必须的,但应当被小心谨慎的管理。
通过依赖倒置,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系,依赖系统将被自动侏儒到需要他们的对象中去。
1.1.3 应用切面(AOP)
依赖倒置能够让互相协作的软件组件保持松散耦合,而面向切面编程(aspect-oriented-programming),允许你把遍布应用各处的功能分离出来形成可重用的组件。
AOP往往被定义为促使软件系统实现关注点的分离技术。例如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们会跨越系统的多个组件。
1.1.4 消除样板式代码
最常用的是JDBC代码,比如查询,只有少量查询代码淹没在一堆JDBC的样板式代码中。而且JDBC不是产生样板式代码的唯一场景。
JDBC不是生产样板式代码的以为场景。在许多编程场景中往往会导致类似的样板式代码,JMS、JNDI和使用REST服务通常也涉及大量的重复代码。
1.2 容纳Bean
1.2.1 使用应用上下文
Spring自带了多种类型的应用上下文:
- AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文;
- AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文;
- ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源;
- FileSystemXmlApplicationContext:从文件系统下的一个或多个XML配置文件中加载上下文定义;
- XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义;
1.2.2 Bean的生命周期
- Spring对Bean进行实例化;
- Spring将值和Bean的引用注入到Bean对应的属性中;
- 如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法;
- 如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器传入实例;
- 如果Bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将Bean所在的应用上下文的引用传入进来;
- 如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
- 如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似的,如果Bean使用initMethod声明了初始化方法,该方法也会被调用;
- 如果Bean实现了BeanPostPrecessor接口,Spring将调用他们的postProcessAfterInitialization()方法;
- 此时,Bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;
- 如果Bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果Bean使用destoryMethod声明了销毁方法,该方法也会被调用;
1.3 Spring风景线
1.3.1 Spring模块
当我们下载Spring发布版本并查看其lib目录时,会发现里面有多个JAR文件,在Spring4.0中包括了20个不同的模块,每个模块会有3个JAR文件(二进制类库、源码的JAR以及JavaDoc的JAR)。
这些模块分为6类不同的功能:
- 数据库访问与集成:JDBC、Transaction、ORM、OXM、Messaging、JMS;
- Web与远程调用:Web、WebServlet、WebPortlet、WebSocket;
- 面相切面编程:AOP、Aspects;
- Instrumentation:Instrument、InstrumentTomcat;
- Spring核心容器:Beans、Core、Context、Expression、ContextSupport;
- 测试:Test;
1.3.2 Spring Portfolio
事实上,Spring远不是Spring框架锁下载的那些。概括的讲,整个Spring Portfolio几乎为每一个领域的Java开发都提供了Spring编程模型。
- SpringWebFlow:基于流程的会话式Web应用;
- SpringWebService:提供了契约优先的WebService模型;
- SpringSecurity:提供了声明式的安全机制;
- SpringIntegration:提供了多种通用应用集成模型的Spring声明式风格实现;
- SpringBatch:提供对数据进行大量操作;
- SpringData:为持久化提供了一种简单的编程模型;
- SpringSocial:它能够帮助你通过REST API连接Spring应用;
- SpringMobile:支持移动Web应用开发;
- SpringforAndroid:基于Android设备的本地应用提供某些简单的支持;
- SpringBoot:大量依赖于自动配置技术,消除大部分Spring配置。