《Spring实战》第一章 — Spring之旅

1.1 使用Spring简化Java开发

    为了下降Java开发,Spring使用了一下4种关键策略:数据库

  • 基于POJO的轻量级和最小侵入性编程;
  • 经过依赖注入和面向接口实现松耦合;
  • 基于切面和管理进行声明式编程;
  • 经过切面和模版减小样板式代码;

1.1.1 激发POJO的潜能

    Spring竭力避免因自身的API而弄乱你的代码。不会强迫你去实现Spring规范的接口或继承Spring规范的类,相反,它的类一般没有任何痕迹表名你使用了Spring。最坏的场景是,一个类或许会使用Spring的注解,但它仍然是POJO。编程

1.1.2 依赖注入(DI)

    任何一个有实际意义的应用都会由两个或者更多的类组合,这些类相互之间进行协做来完成特定的业务逻辑。按照传统作法,每一个对象负责管理与本身互相协做的对象的引用,这将会致使高度耦合和难以测试的代码。安全

    耦合具备两面性。一方面,紧密耦合的代码难以测试、难以复用、难以理解,而且典型地出现打地鼠式的bug特性。另外一方面,必定程度的耦合又是必须的,彻底没有耦合的代码什么也作不了。总而言之,耦合是必须的,但应当被当心谨慎的管理。框架

    经过依赖倒置,对象的依赖关系将由系统中负责协调各对象的第三方组件在建立对象的时候进行设定。对象无需自行建立或管理它们的依赖关系,依赖系统将被自动侏儒到须要他们的对象中去。post

1.1.3 应用切面(AOP)

    依赖倒置可以让互相协做的软件组件保持松散耦合,而面向切面编程(aspect-oriented-programming),容许你把遍及应用各处的功能分离出来造成可重用的组件。测试

    AOP每每被定义为促使软件系统实现关注点的分离技术。例如日志、事务管理和安全这样的系统服务常常融入到自身具备核心业务逻辑的组件中去,这些系统服务一般被称为横切关注点,由于它们会跨越系统的多个组件。spa

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的生命周期

  1. Spring对Bean进行实例化;
  2. Spring将值和Bean的引用注入到Bean对应的属性中;
  3. 若是Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法;
  4. 若是Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器传入实例;
  5. 若是Bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将Bean所在的应用上下文的引用传入进来;
  6. 若是Bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
  7. 若是Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。相似的,若是Bean使用initMethod声明了初始化方法,该方法也会被调用;
  8. 若是Bean实现了BeanPostPrecessor接口,Spring将调用他们的postProcessAfterInitialization()方法;
  9. 此时,Bean已经准备就绪,能够被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;
  10. 若是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配置。