《spring实战》学习笔记-第一章:spring之旅

1.1  简化java开发

Spring最根本的使命上:简化Java开发

为了降低Java开发的复杂性,Spring采取了以下4种关键策略:
  基于POJO的轻量级和最小侵入性编程;
  通过依赖注入和面向接口实现松耦合;
  基于切面和惯例进行声明式编程;
  通过切面和模板减少样板式代码。

1.1.1 激发POJO的潜能
  Spring赋予POJO魔力的方式之一就是通过DI来装配它们。
1.1.2 依赖注入
  通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系,如下图所示,依赖关系将被自动注入到需要它们的对象当中去。

观察它如何工作
  Spring通过应用上下文(Application Context)装载bean的定义并把它们组装起来。Spring应用上下文全权负责对象的创建和组装。Spring自带了多种应用上下文的实现,它们之间主要的区别仅仅在于如何加载配置。
1.1.3 应用切面
  面向切面编程往往被定义为促使软件系统实现关注点的分离一项技术。
1.1.4 使用模板消除样板式代码
  JDBC不是产生样板式代码的唯一场景。在许多编程场景中往往都会导致类似的样板式代码,JMS、JNDI和使用REST服务通常也涉及大量的重复代码。
  Spring旨在通过模板封装来消除样板式代码。Spring的JdbcTemplate使得执行数据库操作时,避免传统的JDBC样板代码成为了可能。

1.2 容纳你的Bean  

  在基于Spring的应用中,你的应用对象生存于Spring容器(container)中。如下图所示,Spring容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期,从生存到死亡(在这里,可能就是new到finalize())。

  容器是Spring框架的核心。Spring容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。
  Spring自带了多个容器实现,可以归为两种不同的类型。bean工厂(由org.springframework. beans. factory.beanFactory接口定义)是最简单的容器,提供基本的DI支持。
  应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。
  虽然我们可以在bean工厂和应用上下文之间任选一种,但bean工厂对大多数应用来说往往太低级了,因此,应用上下文要比bean工厂更受欢迎。我们会把精力集中在应用上下文的使用上,不再浪费时间讨论bean工厂。

1.2.1 使用应用上下文
  Spring自带了多种类型的应用上下文。下面罗列的几个是你最有可能遇到的。
  AnnotationConfigApplicationContext: 从一个或多个基于Java的配置类中加载Spring应用上下文。
  AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文。
  ClassPathXmlApplicationContext: 从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
  FileSystemXmlapplicationcontext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
  XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义
  无论是从文件系统中装载应用上下文还是从类路径下装载应用上下文,将bean加载到bean工厂的过程都是相似的。例如,如下代码展示了如何加载一个FileSystemXmlApplicationContext:

ApplicationContext context= new ClassPathXmlApplicationContext("D:/knight.xml"); 

  类似地,你可以使用ClassPathXmlApplicationContext从应用的类路径下加载应用上下文:

AplicationContext context= new ClassPathXmlApplicationContext( "knight.xml "); 

如果你想从Java配置中加载应用上下文,那么可以使用AnnotationConfigApplicationContext:

AplicationContext context= new AnnotationConfigApplicationContext(com.config.KnightConfig.class);   

  在这里没有指定加载Spring应用上下文所需的XML文件,AnnotationConfigApplicationContext通过一个配置类加载bean。应用上下文准备就绪之后,我们就可以调用上下文的getBean()方法从Spring容器中获取bean。

1.2.2 bean的生命周期
  在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。一旦该bean不再被使用,则由Java自动进行垃圾回收。
相比之下,Spring容器中的bean的生命周期就显得相对复杂多了。正确理解Spring bean的生命周期非常重要,因为你或许要利用Spring提供的扩展点来自定义bean的创建过程。下图展示了bean装载到Spring应用上下文中的一个典型的生命周期过程。

  正如你所见,在bean准备就绪之前,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使用init-method声明了初始化方法,该方法也会被调用;
  8.如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法;
  9.此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
  10.如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
  现在你已经了解了如何创建和加载一个Spring容器。但是一个空的容器并没有太大的价值,在你把东西放进去之前,它里面什么都没有。为了从Spring的DI中受益,我们必须将应用对象装配进Spring容器中。

1.3 俯瞰Spring风景线

  在Spring框架的范畴内,你会发现Spring简化Java开发的多种方式。但在Spring框架之外还存在一个构建在核心框架之上的庞大生态圈,它将Spring扩展到不同的领域,例如Web服务、REST、移动开发以及NoSQL。

1.3.1 Spring模块
  Spring框架由6个定义良好的模块分类组成。这些模块为开发企业级应用提供了所需的一切。但是你也不必将应用建立在整个Spring框架之上,你可以自由地选择适合自身应用需求的Spring模块;当Spring不能满足需求时,完全可以考虑其他选择。事实上,Spring甚至提供了与其他第三方框架和类库的集成点,这样你就不需要自己编写这样的代码了。

 

Spring核心容器
  容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建、配置和管理。在该模块中,包括了Spring bean工厂,它为Spring提供了DI的功能。基于bean工厂,我们还会发现有多种Spring应用上下文的实现,每一种都提供了配置Spring的不同方式。除了bean工厂和应用上下文,该模块也提供了许多企业服务,例如E-mail、JNDI访问、EJB集成和调度。
  所有的Spring模块都构建于核心容器之上。当你配置应用时,其实你隐式地使用了这些类。
Spring的AOP模块
  在AOP模块中,Spring对面向切面编程提供了丰富的支持。这个模块是Spring应用系统中开发切面的基础。与DI一样,AOP可以帮助应用对象解耦。借助于AOP,可以将遍布系统的关注点(例如事务和安全)从它们所应用的对象中解耦出来。
数据访问与集成
  使用JDBC编写代码通常会导致大量的样板式代码,例如获得数据库连接、创建语句、处理结果集到最后关闭数据库连接。Spring的JDBC和DAO(Data Access Object)模块抽象了这些样板式代码,使我们的数据库代码变得简单明了,还可以避免因为关闭数据库资源失败而引发的问题。该模块在多种数据库服务的错误信息之上构建了一个语义丰富的异常层,以后我们再也不需要解释那些隐晦专有的SQL错误信息了!
  对于那些更喜欢ORM(Object-Relational Mapping)工具而不愿意直接使用JDBC的开发者,Spring提供了ORM模块。Spring的ORM模块建立在对DAO的支持之上,并为多个ORM框架提供了一种构建DAO的简便方式。Spring没有尝试去创建自己的ORM解决方案,而是对许多流行的ORM框架进行了集成,包括Hibernate、Java Persisternce API、Java Data Object和iBATISSQL Maps。Spring的事务管理支持所有的ORM框架以及JDBC。
  本模块同样包含了在JMS(Java Message Service)之上构建的Spring抽象层,它会使用消息以异步的方式与其他应用集成。从Spring 3.0开始,本模块还包含对象到XML映射的特性,它最初是Spring Web Service项目的一部分。
  除此之外,本模块会使用Spring AOP模块为Spring应用中的对象提供事务管理服务。
Web与远程调用
  MVC(Model-View-Controller)模式是一种普遍被接受的构建Web应用的方法,它可以帮助用户将界面逻辑与应用逻辑分离。Java从来不缺少MVC框架,Apache的Struts、JSF、WebWork和Tapestry都是可选的最流行的MVC框架。
虽然Spring能够与多种流行的MVC框架进行集成,但它的Web和远程调用模块自带了一个强大的MVC框架,有助于在Web层提升应用的松耦合水平。
除了面向用户的Web应用,该模块还提供了多种构建与其他应用交互的远程调用方案。Spring远程调用功能集成了RMI(Remote Method Invocation)、Hessian、Burlap、JAX-WS,同时Spring还自带了一个远程调用框架:HTTP invoker。Spring还提供了暴露和使用REST API的良好支持。
Instrumentation
  Spring的Instrumentation模块提供了为JVM添加代理(agent)的功能。具体来讲,它为Tomcat提供了一个织入代理,能够为Tomcat传递类文件,就像这些文件是被类加载器加载的一样。如果这听起来有点难以理解,不必对此过于担心。这个模块所提供的Instrumentation使用场景非常有限。

1.3.2 Spring Portfolio
  当谈论Spring时,其实它远远超出我们的想象。事实上,Spring远不是Spring框架所下载的那些。如果仅仅停留在核心的Spring框架层面,我们将错过Spring Portfolio所提供的巨额财富。整个Spring Portfolio包括多个构建于核心Spring框架之上的框架和类库。概括地讲,整个Spring Portfolio几乎为每一个领域的Java开发都提供了Spring编程模型。
Spring Web Flow
  Spring Web Flow建立于Spring MVC框架之上,它为基于流程的会话式Web应用(可以想一下购物车或者向导功能)提供了支持。
Spring Web Service
  Spring Security
安全对于许多应用都是一个非常关键的切面。利用Spring AOP,Spring Security为Spring应用提供了声明式的安全机制。
Spring Integration
Spring Batch
  当我们需要对数据进行大量操作时,没有任何技术可以比批处理更胜任这种场景。如果需要开发一个批处理应用,你可以通过Spring Batch,使用Spring强大的面向POJO的编程模型。
Spring Data
Spring Social
  这是spring的社交网络扩展模块。它能够帮助你通过RSET API连接spring应用,其中有些spring应用可能并没有任何社交方面的功能目标。
Spring Mobile
  Spring Mobile是Spring MVC新的扩展模块,用于支持移动Web应用开发。
Spring for Android
  与Spring Mobile相关的是Spring Android项目。这个新项目,旨在通过Spring框架为开发基于Android设备的本地应用提供某些简单的支持。
Spring Boot
  Spring Boot大量依赖自动配置技术,它能够消除大部分spring配置。

 1.5 小结

  现在,你应该对Spring的功能特性有了一个清晰的认识。Spring致力于简化企业级Java开发,促进代码的松散耦合。成功的关键在于依赖注入和AOP。

  在本章,我们先体验了Spring的DI。DI是组装应用对象的一种方式,借助这种方式对象无需知道依赖来自何处或者依赖的实现方式。不同于自己获取依赖对象,对象会在运行期赋予它们所依赖的对象。依赖对象通常会通过接口了解所注入的对象,这样的话就能确保低耦合。
  除了DI,我们还简单介绍了Spring对AOP的支持。AOP可以帮助应用将散落在各处的逻辑汇集于一处——切面。当Spring装配bean的时候,这些切面能够在运行期编织起来,这样就能非常有效地赋予bean新的行为。
  依赖注入和AOP是Spring框架最核心的部分,因此只有理解了如何应用Spring最关键的功能,你才有能力使用Spring框架的其他功能。在本章,我们只是触及了Spring DI和AOP特性的皮毛。在以后的几章,我们将深入探讨DI和AOP。

-
原文地址:https://www.cnblogs.com/gugibv/p/7843190.html